2011-05-29 49 views
4

我似乎無法找出正則表達式匹配的格式的任何字符串的preg_replace - 如何匹配任何非 * *

**(anything that's not **)** 

我試圖在PHP這樣做

$str = "** hello world * hello **"; 
$str = preg_replace('/\*\*(([^\*][^\*]+))\*\*/s','<strong>$1</strong>',$str); 

但沒有字符串替換完成。

回答

4

您可以使用assertion?!一個字符明智配對.佔位符:

= preg_replace('/\*\*(((?!\*\*).)+)\*\*/s', 

這基本上意味着匹配任意數量的anythings (.)+,但.永遠不能佔據的\*\*

+0

+1非常好的一個 – dariush 2014-06-12 20:50:53

1

你可以用懶惰匹配

\*\*(.+?)\*\* 
# "find the shortest string between ** and ** 

或貪婪的一個

\*\*((?:[^*]|\*[^*])+)\*\* 
# "find the string between ** and **, 
# comprising of only non-*, or a * followed by a non-*" 
1

這應該工作:

$result = preg_replace(
    '/\*\*  # Match ** 
    (   # Match and capture... 
    (?:  # the following... 
     (?!\*\*) # (unless there is a ** right ahead) 
    .   # any character 
    )*   # zero or more times 
    )   # End of capturing group 
    \*\*  # Match ** 
    /sx', 
    '<strong>\1</strong>', $subject); 
1
preg_replace('/\*\*(.*?)\*\*/', '<strong>$1</strong>', $str); 
0

的地方嘗試使用:

$str = "** hello world * hello **"; 
$str = preg_replace('/\*\*(.*)\*\*/s','<strong>$1</strong>',$str); 
+0

'。*'也會快樂地匹配'**'。 – 2011-05-29 19:47:07

+0

是的,但不是最後一個 - 我認爲這是他需要的 – 2011-05-29 19:54:39

+0

考慮** **這很重要**這不重要**但這是**' - 您的正則表達式將匹配整個字符串,而不是隻有「重要」位。 – 2011-05-30 07:42:15