Preg_match,如果<code> </ code>格式正确

goo*_*ing 2 php preg-match

if(preg_match("/(.*(&lt;code&gt;).*(&lt;\/code&gt;).*)*/", $string))
Run Code Online (Sandbox Code Playgroud)

我已经尝试了很多个小时,但我无法让它发挥作用.我希望如果用户格式化文本正确,如:

(any_string*<code>any_string*</code>any_string*)*
Run Code Online (Sandbox Code Playgroud)

只有这样我才能用*表示文本格式为空字符串或多次.我的表情有什么问题?

编辑:我想要匹配lalala text <code>dlalala lala code</code> lalalal.如果它lala <code> lalala或者lalal </code> <code> lalala <code>alala我们不想匹配它.

Tot*_*oto 6

这适用于2个给定的测试用例:

$arr = array('lalala text <code>dlalala lala code</code> lalalal.',
             'lala <code> lalala or lalal </code> <code> lalala <code>alala');
foreach ($arr as $str) {
    echo "$str\n";
    if (preg_match('#^(?<!<code>).*<code>.*?</code>(?!.*<code>)#', $str)) {
        echo "===> Match\n";
    } else {
        echo "===> Not match\n";
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

lalala text <code>dlalala lala code</code> lalalal.
===> Match
lala <code> lalala or lalal </code> <code> lalala <code>alala
===> Not match
Run Code Online (Sandbox Code Playgroud)

关于正则表达式的一些解释:

#           : regex delimiter
^           : begining of string
  (?<!      : start negative lookbehind
    <code>  : literally <code>
  )         : end of lookbehind
  .*        : any char any number of time
  <code>    : literally <code>
  .*?       : any char any number of time not greedy
  </code>   : literally </code>
  (?!       : start negative lookahead
    .*      : any char any number of time
    <code>  : literally <code>
  )         : end of lookahead
#           : regex delimiter
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关环视的有用信息