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

时间:2012-02-26 04:13:28

标签: php preg-match

if(preg_match("/(.*(&lt;code&gt;).*(&lt;\/code&gt;).*)*/", $string))

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

(any_string*<code>any_string*</code>any_string*)*

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

编辑:我想匹配lalala text <code>dlalala lala code</code> lalalal。如果是lala <code> lalalalalal </code> <code> lalala <code>alala,那么我们就不希望与之匹配。

7 个答案:

答案 0 :(得分: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";
    }
}

<强>输出:

lalala text <code>dlalala lala code</code> lalalal.
===> Match
lala <code> lalala or lalal </code> <code> lalala <code>alala
===> Not match

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

#           : 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

您可以找到有关外观here

的一些有用信息

答案 1 :(得分:4)

您可能可以在代码表达式中使用贪婪杀手?(此处有更多信息:Matching text between delimiters: greedy or lazy regular expression?),所以如果你有这样的代码:

<code>foo</code> another <code>bar</code> 

它只匹配foobar而不是foo</code> another <code>bar,您也应该使用preg_match_all()(带有标记PREG_OFFSET_CAPTURE)并编写自己的解析器。或者更确切地说使用preg_replace_callback()

// Just strtolower example (this would do formatting)
function myCallback( $matches){
    return strlower( $matches[2]);
}

$string = preg_replace_callback("/(&lt;code&gt;).*?(&lt;\/code&gt;)/si", 'myCallback', $string)

请注意.*?中的问号。您还应该使用si修饰符,以便您的代码适用于以下代码:

lorem ipsum <code>
foo
</code> bar

如果您需要验证,可以使用:

$string = preg_replace("/(&lt;code&gt;).*?(&lt;\/code&gt;)/si", '', $string);
if( (strpos( $string, '<code') !== false) || (strpos( $string, '</code') !== false){
    echo 'Invalid code';
}

答案 2 :(得分:3)

<?php
$string = "aaa<code>asd</code>aaaasd";
if (preg_match("#[a-zA-Z ]+<code>[a-zA-Z ]+<\/code>[a-zA-Z ]+#", $string))
{
echo "It's a match!\n";
} else {
echo "No match, sorry.\n";
}

答案 3 :(得分:2)

    $string = "aaa<code>dlalala lala code</code>aaa";
    if (preg_match("#.*<code>.*<\/code>.*#", $string)) {
            echo "OK\n";
    } else {
            echo "NOK\n";
    }

答案 4 :(得分:2)

试试这些

$string = "lalala text <code>dlalala lala code</code> lalalal";

if(strlen($string)>0){
    preg_match("/\<code\>(.*)\<\/code\>/",$string, $code);
    echo $code[1];
}else{
    echo "no code found";
}

输出将是:

  

dlalala lala code

祝你好运:)

答案 5 :(得分:2)

<?php
$sample_text = <<<EOF
blah blah
<code>one</code>
foo<code>two</code>three</code>
<code><code>four</code>bar
</code><code>five</code>foobar
<code>six</code>
blah blah blah
EOF;

preg_match_all('/<code>(?\'code\'((?!<\/?code>).)*)<\/code>/', $sample_text, $codes);

print_r($codes); 
?>

我相信你正在寻找的东西。我提到here并测试了正则表达式here

答案 6 :(得分:0)

你最好使用strpos进行简单的字符串比较,这意味着你不必担心转义特殊字符,而且速度更快。

这将有效

已获编辑以获取标记。

$string = "This string has 'Anything <code> anything </code> anything' in it in the right order.";
$start = strpos($string, '<code>');
$end = strpos($string, '</code>');
if ($start !== FALSE && $end !== FALSE && $end > $start){
     echo $string;
}else{
    echo 'incorrectly formatted';
}

如果您想使用PREG_MATCH

if(preg_match("/.*(<code>).*(<\/code>).*/", $string)){
       echo $string
  }

注意 - 您不希望使用HTML实体,除非您确定使用HTML实体格式化字符串。你不需要外面的圆括号。