我想将以下字符串与正则表达式匹配:
$string ="test string [% code content ='test content' class ='myclass' %]";
我想用百分比括号从这个字符串中提取类和内容。我使用这种模式进行匹配
$regex_pattern = "/[% ?.*](.*)[\/%]/";
preg_match_all($regex_pattern,$content,$matches);
但没有获得我需要的输出。
答案 0 :(得分:1)
您可以使用正则表达式捕获contents
和class
值,无论它们在[% ... %]
中的位置如何:
(?: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";
?>
输出:
test content
myclass
答案 1 :(得分:1)
此处您需要使用\G
锚点,因为您尝试从块[%..%]
中抓取一些内容。
(?:\[%|(?<!^)\G).*?(content|class)\s*='([^']*)'(?=(?:(?!\[%|%\]).)*?%])
示例:强>
$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
)
)