2011-05-12 85 views
3

這是一個後續問題的一個I posted here(感謝marioPHP的preg_replace問題

好了,我有一個的preg_replace語句sometext替換URL字符串,從查詢字符串插入值(使用$_GET["size"])和插入來自關聯數組的值(使用$fruitArray["$1"]回參考)

輸入URL字符串將是:

http://mysite.com/script.php?fruit=apple 

輸出字符串應是:

http://mysite.com/small/sometext/green/ 

的PHP我有如下:

$result = preg_replace('|http://www.mysite.com/script.php\?fruit=([a-zA-Z0-9_-]*)|e', ' "http://www.mysite.com/" .$_GET["size"]. "/sometext/" .$fruitArray["$1"]. "/"', $result); 

此代碼輸出以下字符串:

http://mysite.com/small/sometext// 

代碼似乎跳過$fruitArray["$1"]值。

我錯過了什麼?

謝謝!

+1

當問這樣一個問題,你應該完全刪除$ _GET和$ fruitArray並使用常量來將問題本地化到preg_replace。也許你的變量是空的,我們無法確定它 – 2011-05-12 17:23:57

+0

@Riccardo Galli你在那裏是非常正確的,經驗教訓 - 必須停止在fag數據包的背面寫入php並移動到PHP IDE - 你有什麼建議嗎? ?我是一個新手:/乾杯。 – Matt 2011-05-12 19:23:18

+0

通過重寫一些前面的代碼來解決這個問題;我有其他的preg_replace調用干擾的URL字符串:/也許我的代碼上面是半 - OK :-)這個項目開始很小,但現在它的數百和​​數百行代碼 - 對所有的道歉 - 我很欣賞答案,歡呼! – Matt 2011-05-12 19:28:59

回答

1

好了,奇怪的事情。

您的代碼工作對我來說非常好(請參閱下面我用於本地測試的代碼)。

,但我卻解決兩件事情與你的正則表達式:

  1. 不要使用|作爲分隔符,它在正則表達式中有意義。
  2. 你的正則表達式只會給你錯覺,它不起作用,因爲你不是逃避.。它實際上也會匹配http://www#mysite%com/script*php?fruit=apple

測試腳本:

$fruitArray = array('apple' => 'green'); 
$_GET = array('size' => 'small'); 
$result = 'http://www.mysite.com/script.php?fruit=apple'; 
$result = preg_replace('@http://www\.mysite\.com/script\.php\?fruit=([a-zA-Z0-9_-]*)@e', ' "http://www.mysite.com/" .$_GET["size"]. "/sometext/" .$fruitArray["$1"]. "/"', $result); 
echo $result; 

輸出:

Rudis-Mac-Pro:~ rudi$ php tmp.php 
http://www.mysite.com/small/sometext/green/ 

這使我想到的唯一的事情就是$fruitArray不正確設置你。


順便說一句,我覺得這可能是比較合適的,因爲它會給你在未來更靈活,更好的語法高亮和更有意義比使用e改性劑在內部稱爲evil()功能由PHP ;-)這也是一個更清潔,閱讀,國際海事組織。

$result = preg_replace_callback('@http://www\.mysite\.com/script\.php\?fruit=([a-zA-Z0-9_-]*)@', function($matches) { 
     global $fruitArray; 
     return 'http://www.mysite.com/' . $_GET['size'] . '/sometext/' . $fruitArray[$matches[1]] . '/'; 
}, $result); 
+0

感謝您的詳細解答並指出了更好的方法。非常感謝。我要去preg_replace_callback,對我來說是新的東西,歡呼:) – Matt 2011-05-12 19:34:48

+0

沒問題!很高興我能幫上忙,聽說這不是你發佈的這個代碼,因爲它讓我感到困惑,它會適用於我而不是你;-) – 2011-05-12 19:40:09

0

看起來你已經忘記逃離?。它應該是/script.php\?,並且\?可以正確地轉義,就像你提供的鏈接答案一樣。

+0

哎呀,我只是在這裏發佈的例子中忘了這麼做;實際的代碼被正確轉義。代碼更新,謝謝指出 - 問題依然存在。 – Matt 2011-05-12 17:17:50

0

$ fruitArray [ 「\ $ 1」]而不是$ fruitArray [ 「$ 1」]

1

我再寫一遍,我不明白好哪裏是錯誤的預浸結果的評價是在PHP非常怪異

preg_replace(
    '|http\://([\w\.-]+?)/script\.php\?fruit=([\w_-]+)|e' 
    , '"http://www.$1/".$_GET["size"]."/sometext/".$fruitArray["$2"]."/";' 
    , $result 
); 
+0

感謝你的努力,我現在設法解決了這個問題。正則表達式非常強大,但很難掌握:/乾杯! – Matt 2011-05-12 19:31:09

+0

@Matt正則表達式就像你說的那樣強大,但是即使你寫了它,有時也很難被人類讀取,並且是一個很好的練習。 正則表達式只是練習......保持這樣的正則表達式問題總是一個漂亮的問題。 – 2011-05-12 20:35:59