我有下一个
$pattern = "~'(.*?)\\.(.*?)'~i";
$replacement = "'\\1\\\\x2e\\2'"
$subject = "window.location.href='example.com'";
preg_replace($pattern, $replacement, $subject);
它工作得很好,我得到了
"window.location.href='example\x2ecom'"
但如果我有
$subject = "window.location.href='www.example.com'";
或
$subject = "window.location.href='www.example.example.com'";
我在字符串中有点。
请帮助$replacement
更新:
我需要获取字符串''
中的所有点都应为\x2e
如果我有
"window.location.href='www.example.example.com'"
然后我需要
"window.location.href='www\x2eexample\x2eexample\x2ecom'"
答案 0 :(得分:2)
一种选择是使用正向前瞻和否定字符类,以便仅匹配.
字符之间字符串末尾的文字'
字符:
$pattern = "~\\.(?=[^']*'$)~i";
\\.
- 字面上匹配.
字符。(?=
- 开始积极向前看。[^']*'$
- 按字面意思匹配前面的字符.
,如果后跟零个或多个非'
个字符,后跟字符串末尾的'
)
- 积极前瞻的结束。换句话说,只会匹配字符串末尾的.
个字符之间的'
个字符。
$pattern = "~\\.(?=[^']*'$)~i";
$replacement = "\\x2e";
$subject = "window.location.href='www.example.com'";
echo preg_replace($pattern, $replacement, $subject);
输出:
"window.location.href='www\x2eexample\x2ecom'"
根据您的评论:
如果子串window.location.href='.*'
出现多次,那么您可以使用替换(?:$|;)
,使其匹配到最后;
或字符串结尾{{{ 1}}。
$
$pattern = "~\\.(?=[^']*'(?:$|;))~i";
输出:
$pattern = "~\\.(?=[^']*'(?:$|;))~i";
$replacement = "\\x2e";
$subject = "window.location.href='.www.test.test.com.'; window.location.href='.www.test.test.com.';";
echo preg_replace($pattern, $replacement, $subject);
答案 1 :(得分:1)
使用preg_replace_callback
代替preg_replace
,这是一个想法。它允许您传入一个函数来操作每个匹配。
$subject = "window.location.href='example.com.com.com.com.com'";
$subject = preg_replace_callback("~(?<=')(.*?)(?=')~", function($m) {return preg_replace('~\.~', '\x2e', $m[1]);}, $subject);
print $subject;
这将输出:
window.location.href='example\x2ecom\x2ecom\x2ecom\x2ecom\x2ecom'
基本上我们在这里做的是匹配滴答声内的所有内容。然后,当找到匹配项时,它会在该字符串中交换\x2e
的每个点。
这是一个有效的演示: