使用preg_replace替换单引号之间的所有点字符

时间:2016-01-30 16:49:51

标签: php regex preg-replace

我有下一个

$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'"

2 个答案:

答案 0 :(得分:2)

一种选择是使用正向前瞻和否定字符类,以便仅匹配.字符之间字符串末尾的文字'字符:

$pattern = "~\\.(?=[^']*'$)~i";

说明:

  • \\. - 字面上匹配.字符。
  • (?= - 开始积极向前看。
  • [^']*'$ - 按字面意思匹配前面的字符.,如果后跟零个或多个非'个字符,后跟字符串末尾的'
  • ) - 积极前瞻的结束。

换句话说,只会匹配字符串末尾的.个字符之间的'个字符。

Example Here

$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}}。

$

Example Here

$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的每个点。

这是一个有效的演示:

http://ideone.com/eYh2rO