[英]Using preg_replace to replace all occurrences in php
正則表達式絕對是我的弱點,這一點讓我完全難過。 我正在構建一個相當基本的搜索功能,我需要能夠根據以下模式更改我的用戶輸入:
學科:
%22first set%22 %22second set%22-drupal -wordpress
期望的輸出:
+"first set" +"second set" -drupal -wordpress
我希望我能得到更多的幫助,因為我通常希望至少發布我到目前為止的解決方案,但在這一方面我不知所措。
任何幫助表示贊賞。 謝謝。
似乎您的數據是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
替換為"
。
preg_replace('/%22((?:[^%]|%[^2]|%2[^2])*)%22/', '+"$1"', $str);
說明: $1
是一個反向引用,引用正則表達式中的first ()
section,在本例中為((?:[^%]|%[^2]|%2[^2])*)
。 並且[^%]
和之后的替換(...|...|...)
會阻止%22
之間由於貪婪而被匹配。 請參見http://en.wikipedia.org/wiki/Regular_expression#Lazy_quantification 。
我在JavaCC示例中找到了匹配塊注釋( /* */
)的技術,我找不到任何解釋它的其他網頁,所以這里有一個更清晰的例子:匹配12345 12345........12345
之間的文本塊12345........12345
之間沒有12345: /12345([^1]|1[^2]|12[^3]|123[^4]|1234[^5])*12345/
這是你在找什么?
<?php
$input = "%22first set%22 %22second set%22-drupal -wordpress";
$res = preg_replace( "/\%22(.+?)\%22/","+\"(\\1)\" ", $input);
print $res;
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.