簡體   English   中英

用正則表達式替換字符串中的數組值?

[英]Replace array values in string with regex?

說我有以下數組和字符串:

$array  = array('$AA', '$AB', '$AC', '$ZZ');
$string = 'String mentioning $AA and $AB and $CZ and $MARTASS';

我想檢查$ string與$ array的匹配情況。 應檢查$ string中以“ $”開頭的每個單詞。 在示例中,找到了$ AA和$ AB的匹配項; 不適用於$ CZ。 所需的輸出將是:

String mentioning {MATCH} and {MATCH} and {NO-MATCH}

一個正則表達式是否可以實現?還是編寫幾行PHP更好? 任何輸入都可以收到:)

應該可以按以下順序進行兩次查找和替換:

第一:

\b(($AA)|($AB)|($AC)|($ZZ))\b ---> {MATCH}

第二:

\b$\w+\b ---> {NO-MATCH}

我不確定這是PHP語法,但到達那里應該並不難。 \\b是一個單詞分隔符邊界,我相信PHP允許這樣做。

編輯:您可能需要轉義$ ,但不確定是否已將其分組。

對的,這是可能的。 看一下preg_replace_callback()文檔中的示例。 您將使用以下形式的替換調用:

function substituteVar($matches) {
    ...
}

...

$newString = preg_replace_callback("/\\$(\w+)/", 'substituteVar', $string);

我想我將replaceVar substituteVar()的內容保留為“讀者練習”。 :-)

這應該工作...

<?php
  $string = 'String mentioning $AA and $AB and $CZ and $MARTASS';
  echo preg_replace_callback("/\\$\S+/",
    create_function('$a','return in_array($a[0],array("\$AA", "\$AB", "\$AC", "\$ZZ")) ? "{MATCH}" : "{NO-MATCH}";'),
    $string
  );
?>

正則表達式匹配$然后是一個或多個非空格( \\S+ ),然后檢查匹配的字符串是否在數組中(包含在create函數定義中,因此它在范圍內,並且正確地進行了轉義)

我不會在這里使用正則表達式,從頭到尾進行字符串的簡單掃描,查找'$'字符,然后對數組執行二進制搜索會更加簡單和快捷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM