2009-09-14 40 views
3

當我試圖2個不同的正則表達式使用相同的名稱合二爲一,得到了這樣的錯誤消息:了「兩個命名的子模式具有相同的名稱」組合2正則表達式爲一個

警告:的preg_match():編譯 失敗:兩個命名的子模式有 同名偏移量276 ...

一個正則表達式是這樣的:

'%<div class="artikkelen">[\s\S]*?<h2>(?P<title>[\s\S]*?)</h2>%' 

其他看起來像這樣:

'%<div id="article">[\s\S]*?<h1>(?P<title>[\s\S]*?)</h1>%' 

我可以通過以下方式沒有問題結合他們:

'%(<div class="artikkelen">[\s\S]*?<h2>(?P<title>[\s\S]*?)</h2>|<div id="article">[\s\S]*?<h1>(?P<title2>[\s\S]*?)</h1>)%' 

但因爲我用2名,我不喜歡這種方式。我想知道是否有更好的方法來解決這個問題。提前致謝。

最好的問候, 盒(的Boxoft ...簡單&大)

+0

給他們一個不同的名稱。 – Bombe 2009-09-14 10:00:37

+0

這是PHP不使用Perl兼容正則表達式的許多痛苦地方之一。 – tchrist 2011-08-23 19:52:36

回答

0

你可以像這樣,而不是將它們組合起來:

%<div (class="artikkelen"|id="article")>[\s\S]*?<h[12]>(?P<title>[\s\S]*?)</h[12]>% 

這是不完全一樣的,因爲它以前,但可能夠好了。

+0

謝謝。有用。 – boxoft 2009-09-17 12:52:55

24

我找到了這個網頁尋找一種方式有兩個(或更多?)命名具有相同名稱的子模式,而且我發現this page的答案(相關摘錄在這裏)

重複名稱

如果您使用命名模式,您現在可以多次使用相同的名稱,前提是將「(?J)」選項放在模式中。例如:

Match: (?J)(?P<name>Ni.+)|(?P<name>Fr.+) 

這將匹配「尼克」或「弗雷德」,和哪一個匹配,命名模式「名」將設置它。

只是貢獻知識回到宇宙

+3

這是維護所有需求的問題的實際解決方案。 – 2014-01-22 11:32:08

+0

'(?J)'爲模式的其餘部分啓用正則表達式修飾符。您還可以將'J'作爲常規修飾符傳遞給'preg_match()',即'/(?P Ni。+)|(?P Fr。+)/ J',如此處所述:http: /php.net/manual/en/reference.pcre.pattern.modifiers.php – sun 2017-05-16 14:40:24