2011-01-10 96 views
3

中的所有匹配項正則表達式絕對是我的弱點,這一個讓我完全陷入困境。我建立一個非常基本的搜索功能,我需要能夠根據以下方式來改變我的用戶輸入:使用preg_replace替換php

主題:

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

所需的輸出:

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

祝我可以提供更多的幫助,因爲我通常喜歡至少發佈我目前爲止的解決方案,但是在這一方面我很茫然。

任何幫助表示讚賞。謝謝。

+1

看起來你的數據是URL編碼的。如果你應用[urldecode](http://php.net/manual/en/function.urldecode.php),你將會得到''第一組''第二組'-drupal -wordpress`。 ``-drupal`之前有空嗎?還是應該插入? – 2011-01-10 03:29:40

+0

我可以管理這個空間。使用urldecode唯一的問題是,這是一個SQL查詢,我只想要urldecode雙引號,只有當他們在這種模式。 – S16 2011-01-10 03:35:59

回答

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

說明:$1是反向引用,它引用在第一() -section在正則表達式在這種情況下,((?:[^%]|%[^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/

+1

你搖滾。非常感謝你。你有可能提供解決方案的解釋嗎? – S16 2011-01-10 03:37:03

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

這是你在找什麼?

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