正则表达式绝对是我的弱点,这一点让我完全难过。我正在构建一个相当基本的搜索功能,我需要能够根据以下模式更改我的用户输入:
主题:
%22first set%22 %22second set%22-drupal -wordpress
期望的输出:
+"first set" +"second set" -drupal -wordpress
我希望我能得到更多的帮助,因为我通常希望至少发布我到目前为止所提供的解决方案,但是在这一方面我不知所措。
感谢任何帮助。谢谢。
答案 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;
?>