可能重复:
替换所有“foo";介于()之间
你好,
我尝试使用regex来替换()
和style=" and "
之间的所有foo
字符串
这里有一个例子:
blah blah foo blah style="foo text blah (foo and blah foo)"
它应该被替换为:
blah blah foo blah style="foo text blah (bar and blah bar)"
我试着使用这个代码,但它不起作用。
do {
$code = preg_replace('/(style'='"[^)]*)left(?=[^()]*'))([^)]*'")/U', ''1tempvalue'3', $code, -1, $count);
} while($count != 0);
然后我尝试使用foreach来获得结果,然后使用preg_replace正常替换它。
我希望找到答案:),谢谢。
适用于您的字符串,可能需要修改一点才能在所有情况下工作。。。
echo preg_replace_callback('/style="(.*)('(.+'))"/',create_function(
'$matches',
'return "style='"" . $matches[1] . preg_replace("/foo/","bar",$matches[2]) . "'"";'
),'blah blah foo blah style="foo text blah (foo and blah foo)"');
一个有效的正则表达式是:
style="[^(]*'(([^)]*)')"
但是,由于您将有多个匹配项(0表示整体,1表示括号中的值),因此必须使用preg_replace_callback
使用以下正则表达式:
/style=".*?'((.*?)')"/
说明:
style=
"匹配相同的内容.*?
匹配任何字符,但不要以贪婪的方式,尽可能少地匹配'(
匹配((.*?)
匹配样式和括号之间的任何字符,这意味着这是您应该替换的信息')"
匹配)"
您可以使用THIS工具来构建正则表达式字符串。它真的很有帮助,它有一些例子,它会告诉你哪个部分匹配哪个字符串。
这可能是PREG_REPLACE_EVAL
(e修饰符)的一个很好的用法:
$str = 'blah blah foo blah style="foo text blah (foo and fooblah foo)" foo';
echo preg_replace('~(style="[^(]*)('([^)]*'))~ie', "str_replace(''''''', '', '$1') . preg_replace('#'bfoo'b#i', 'bar', '$2')", $str) ."'n";
输出
blah blah foo blah style="foo text blah (bar and fooblah bar)" foo