使用preg_replace替换php中的所有实例

时间:2011-01-10 03:24:01

标签: php regex preg-replace

正则表达式绝对是我的弱点,这一点让我完全难过。我正在构建一个相当基本的搜索功能,我需要能够根据以下模式更改我的用户输入:

主题:

%22first set%22 %22second set%22-drupal -wordpress

期望的输出:

+"first set" +"second set" -drupal -wordpress

我希望我能得到更多的帮助,因为我通常希望至少发布我到目前为止所提供的解决方案,但是在这一方面我不知所措。

感谢任何帮助。谢谢。

3 个答案:

答案 0 :(得分:2)

似乎您的数据是URL编码的。如果您申请urldecode,则会获得

"first set" "second set" -drupal -wordpress

(我假设你在-drupal之前有一个空格。)

现在您必须添加+。同样,我假设您必须在没有-并且不在引号内的所有单词之前添加这些单词:

$str = '"first set" "second set" -drupal -wordpress foo';
echo preg_replace('#( |^)(?!(?:\w+"|-| ))#','\1+', $str));
// prints +"first set" +"second set" -drupal -wordpress +foo

更新:如果您无法使用urldecode,则可以使用str_replace%22替换为"

答案 1 :(得分:1)

preg_replace('/%22((?:[^%]|%[^2]|%2[^2])*)%22/', '+"$1"', $str);

说明:$1是一个反向引用,引用正则表达式中的第一个() - 部分,在本例中为((?:[^%]|%[^2]|%2[^2])*)。此后[^%]及其后的(...|...|...)会阻止%22因贪婪而被匹配。请参阅http://en.wikipedia.org/wiki/Regular_expression#Lazy_quantification

我在JavaCC示例中找到了匹配块注释(/* */)的技术,我找不到任何解释它的其他网页,所以这里有一个更清晰的例子:匹配12345之间的文本块12345........12345之间没有12345:/12345([^1]|1[^2]|12[^3]|123[^4]|1234[^5])*12345/

答案 2 :(得分:1)

这是你要找的吗?

<?php
  $input = "%22first set%22 %22second set%22-drupal -wordpress";
  $res = preg_replace( "/\%22(.+?)\%22/","+\"(\\1)\" ", $input);
  print $res;
?>