preg_replace - 如何匹配任何不是\ * \ *的东西

时间:2011-05-29 19:32:24

标签: php regex preg-replace

我似乎无法找出正则表达式来匹配格式为

的任何字符串
**(anything that's not **)**

我试过在php中做这个

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

但没有更换字符串。

5 个答案:

答案 0 :(得分:4)

您可以使用assertion ?!与角色.占位符配对:

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

这基本上意味着匹配任意数量的任何数字(.)+,但.永远不会占据\*\*的位置

答案 1 :(得分:1)

您可以使用延迟匹配

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

或贪婪的

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

答案 2 :(得分: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);

答案 3 :(得分:1)

preg_replace( '/\*\*(.*?)\*\*/', '<strong>$1</strong>', $str );

答案 4 :(得分:0)

尝试:

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