2013-08-25 32 views
0

我有這樣的代碼正則表達式的結果「分隔符不能是字母,數字或反斜線」

function a($menu_item, $remove_link) { 
    $pattern = 'class="(.+)"(.+)<a.+>(.+)</a>'; 
    if($remove_link) { 
     return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item); //<- line 6 
    } 
    return $menu_item; 
} 

這基本上檢查,如果$remove_link是真實的,然後刪除該鏈接並增加了一個類定義$menu_item

例如,如果我使用

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>'; 
$menu_item = a($menu_item, true); 

它應該返回

<li class="menuitem first selected">Home</li>; 

正則表達式進行測試,它工作在記事本+ +,但我的職責是給這個錯誤:

Warning: preg_replace(): Delimiter must not be alphanumeric or backslash in functions.php on line 6 

我看到PHP的模式必須被「分隔」用斜槓,所以我試圖用class="/(.+)"(.+)<a.+>(.+)/</a>相反,但它給出了同樣的錯誤。

我在想什麼?我如何正確使用分隔符?

+0

見http://php.net/manual/en/regexp.reference.delimiters.php – mario

回答

1

你必須把模式分隔符,在開始時,在該模式的結尾,例如:

$pattern = '#class="(.+)"(.+)<a.+>(.+)</a>#'; 

這裏#/一個更好的選擇,因爲你避免逃避你的模式裏面所有的斜線,但你可以這樣寫:

$pattern = '/class="(.+)"(.+)<a.+>(.+)<\/a>/'; 

順便說一句評論,你的模式會造成許多回溯:

$pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)</a>~'; 

會更好。

請記住,+*默認情況下是貪婪的量詞(即他們儘可能地)。

如果我使用受限制的字符類,而不是點的,我可以停止量詞的貪婪,例如

[^"]+採取一切之外的字符",從而停止時"是找到。

演示:

<?php 
function a($menu_item, $remove_link) { 
    //$pattern = '~class="(.+)"(.+)<a.+>(.+)</a>~'; 
    $pattern = '~class="([^"]+)"([^>]*>)<a[^>]+>([^<]+)<\/a>~'; 
    if($remove_link) { 
     return preg_replace($pattern, 'class="$1 selected"$2$3', $menu_item); 
    } 
    return $menu_item; 
} 

$menu_item = '<li class="menuitem first"><a href="index.php">Home</a></li>'; 
echo a($menu_item, true); 
+0

它消除了錯誤,但文本沒有被替換。爲什麼? – BackSlash

+0

剛剛檢查了您的更新,它不起作用。你的意思是你的模式是false_?你的意思是錯的?我使用Notepad ++進行了檢查,並且製作了一個使用相同正則表達式的小程序,它爲什麼不能用於PHP?附:然而,你的正則表達式不起作用。 – BackSlash

+0

@BackSlash:測試後,你的模式似乎可行,但會導致很多回溯(正則表達式引擎必須前進才能找到匹配項)。我已經用我的模式中的'*'替換了一個'+'量詞(因爲在這個例子中類和'''之間沒有任何內容) –

相關問題