我似乎無法找出正則表達式匹配的格式的任何字符串的preg_replace - 如何匹配任何非 * *
**(anything that's not **)**
我試圖在PHP這樣做
$str = "** hello world * hello **";
$str = preg_replace('/\*\*(([^\*][^\*]+))\*\*/s','<strong>$1</strong>',$str);
但沒有字符串替換完成。
我似乎無法找出正則表達式匹配的格式的任何字符串的preg_replace - 如何匹配任何非 * *
**(anything that's not **)**
我試圖在PHP這樣做
$str = "** hello world * hello **";
$str = preg_replace('/\*\*(([^\*][^\*]+))\*\*/s','<strong>$1</strong>',$str);
但沒有字符串替換完成。
您可以使用assertion?!
一個字符明智配對.
佔位符:
= preg_replace('/\*\*(((?!\*\*).)+)\*\*/s',
這基本上意味着匹配任意數量的anythings (.)+
,但.
永遠不能佔據的\*\*
你可以用懶惰匹配
\*\*(.+?)\*\*
# "find the shortest string between ** and **
或貪婪的一個
\*\*((?:[^*]|\*[^*])+)\*\*
# "find the string between ** and **,
# comprising of only non-*, or a * followed by a non-*"
這應該工作:
$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);
preg_replace('/\*\*(.*?)\*\*/', '<strong>$1</strong>', $str);
的地方嘗試使用:
$str = "** hello world * hello **";
$str = preg_replace('/\*\*(.*)\*\*/s','<strong>$1</strong>',$str);
'。*'也會快樂地匹配'**'。 – 2011-05-29 19:47:07
是的,但不是最後一個 - 我認爲這是他需要的 – 2011-05-29 19:54:39
考慮** **這很重要**這不重要**但這是**' - 您的正則表達式將匹配整個字符串,而不是隻有「重要」位。 – 2011-05-30 07:42:15
+1非常好的一個 – dariush 2014-06-12 20:50:53