2014-03-13 34 views
0

我試圖重寫純文本搜索查詢以匹配我們的搜索引擎使用的內部格式,並且我想用一些正則表達式替換某些單詞,但是隻有當原始文本沒有用雙引號封裝時。這就是我的意思是:PHP的正則表達式 - 替換不包含在引號中的文本

  • rock from adelaide將成爲rock location:adelaide
  • beep "rock from adelaide" boop仍將beep "rock from adelaide" boop
  • find me some rock from "adelaide"將成爲find me some rock location:"adelaide"
  • is there "any rock from adelaide please", thanks將保持is there "any rock from adelaide please", thanks

我這樣一個正則表達式小白和無論我閱讀和研究多少,我都無法想象在這裏解決方案。我可以輕鬆地進行搜索並更換單詞from,但只有匹配的外部引號完全超出了我的意思。

這是我到目前爲止,但顯然它不工作:

<?php 
    $pattern = '%(*ANY)(.*?(")(?(2).*?")(.*?))*?from %s'; 
    $replace = '\1location:'; 
    $subject = 'find me some rock from adelaide but not "rock from perth"'; 
    print preg_replace($pattern, $replace, $subject); 
?> 

預期輸出是:

find me some rock location:adelaide but not "rock from perth"

實際的輸出是:

find me some rock location:adelaide but not "rock location:perth"

Tha你爲你的時間!

回答

1

你想替換不是雙引號的單詞。所以,當我們爆炸字符串時,數組的偶數索引將成爲我們的目標(也是0)。我們需要創建的循環會跳過2個索引,並在那裏使用str_replace()。會是這樣的:

$test = '"rock from perth" xxxxxxx "afjakdhfa" find me some rock from adelaide but not '; 
$array = explode('"', $test); 
$count = count($array); 
for($i = 0; $i < $count; $i+=2) 
{ 
    $array[$i] = str_replace('from', 'location:', $array[$i]); 
} 
$test = implode('"', $array); 
echo $test; 
+0

謝謝,這工作完美,我真的很感謝你的幫助。儘管爲了掌握這些知識,但我仍然非常有興趣知道是否有正則表達式可以做同樣的事情。 – sdmtr

+0

將很難,因爲正則表達式模式不知道這個字符串是否在之間。從'$ test'變量:''來自perth的''和'「xxxxxxx」'之間有雙引號,但是xxxxxxx實際上並不在兩者之間:)如果有一種方法,我會驚訝於同一時間。 – sunshinejr

相關問題