2017-10-10 121 views
1

我想用正則表達式來搜索一個字符串,替換幾個值並構建一個URL。我從來沒有用過正則表達式(從零開始),所以有點卡住了。PHP Regex preg_replace括號之間的多個值

該字符串包含在[方括號內]作爲標識符。我已經嘗試了多種方法 - 我不明白如何構造正則表達式或preg_replace方法以便能夠執行多個替換,理想情況下沒有大量重複的正則表達式行,但是這是我嘗試的方向:

$string= '[mycode="gallery" type="single" id="1" data="only"]'; //INPUT 

    $string = preg_replace('/\mycode="(.*)"\]/', '$1/mycode"', $string); 
    $string = preg_replace('/\type="(.*)"\]/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\id="(.*)"\]/', '?id=$1', $string); 
    $string = preg_replace('/\data="(.*)"\]/', '&data=$1', $string); 

最終輸出:

畫廊/ _mycode_single.php ID = 1個&數據=只(與刪除[]太)

我知道,這是行不通目前,因爲我不?知道編譯多行輸出的方法;任何援助將不勝感激。謝謝!

+0

對不起,是 - ]我認爲我之前的努力遺留下了一個錯字。我之前沒有使用preg_replace_callback - 你能詳細說明嗎?我假設你的意思是在做其他事情之前先使用它來獲取[]括號中的內容? – WWD

+0

使用下面提供的答案工作 - 再次感謝 – WWD

回答

0

你將需要去兩層,首先拉動[]之間的所有內容,然後根據需要替換值。您可以使用preg_replace_callback 來完成此操作。

$string= '[mycode="gallery" type="single" id="1" data="only"]'; 
echo preg_replace_callback('/\[([^\]]+)\]/', function($match) { 
    $string = preg_replace('/\h*mycode="([^"]+)"\h*/', '$1/mycode', $match[1]); 
    $string = preg_replace('/\h*type="([^"]+)"\h*/', 'mycode_$1.php', $string); 
    $string = preg_replace('/\h*id="([^"]+)"\h*/', '?id=$1', $string); 
    $string = preg_replace('/\h*data="([^"]+)"\h*/', '&data=$1', $string); 
    return $string; 
}, $string); 

你的正則表達式沒幾個原因工作:

  1. 您的字符串不與正則表達式逃逸]
  2. 反斜線結束或創建元字符,\d是一個數字\t是一個標籤。
  3. 如果建立一個網址,你不希望在返回值雙引號
  4. 您還需要修剪的前導和尾部空格

演示:https://3v4l.org/KDD0B

+0

非常感謝 - 您的解決方案完美無缺! – WWD