内容中的正则表达式匹配

时间:2015-04-13 06:17:57

标签: php regex

我想将以下字符串与正则表达式匹配:

$string ="test string [% code content ='test content' class ='myclass' %]";

我想用百分比括号从这个字符串中提取类和内容。我使用这种模式进行匹配

$regex_pattern = "/[% ?.*](.*)[\/%]/";
preg_match_all($regex_pattern,$content,$matches);

但没有获得我需要的输出。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式捕获contentsclass值,无论它们在[% ... %]中的位置如何:

(?:content|class)\s*='([^']+?)'(?=(?:(?!\[\%|\%\]).)*?\%\])

请参阅demo

<?php
    $re = "/(?:content|class)\\s*=\\s*'([^']+?)'(?=(?:(?!\\[\\%|\\%\\]).)*?\\%\\])/"; 
    $str = "test string [% code content ='test content' class ='myclass' %]"; 
    preg_match_all($re, $str, $matches);
    echo $matches[1][0] . "\n";
    echo $matches[1][1] . "\n";
?>

这是sample program

输出:

test content                                                                                                                                                                                                                                           
myclass

答案 1 :(得分:1)

此处您需要使用\G锚点,因为您尝试从块[%..%]中抓取一些内容。

(?:\[%|(?<!^)\G).*?(content|class)\s*='([^']*)'(?=(?:(?!\[%|%\]).)*?%])

DEMO

示例:

$s = "content ='outside content' test string [% code content ='test content' class ='myclass' %]";
preg_match_all("~(?:\[%|(?<!^)\G).*?\K(content|class)\s*='([^']*)'(?=(?:(?!\[%|%\]).)*?%])~", $s, $matches);
print_r($matches);

<强>输出:

Array
(
    [0] => Array
        (
            [0] => content ='test content'
            [1] => class ='myclass'
        )

    [1] => Array
        (
            [0] => content
            [1] => class
        )

    [2] => Array
        (
            [0] => test content
            [1] => myclass
        )

)