2013-11-01 16 views
2

所以 - 我有一個字符串像這樣(字符串1例):PCRE正則表達式。從字符串2的結尾處,刪除串1,與任意數量*字符

'aaaaabbbbbcccccword' 
'aaaaabbbbbcccccwor*d' 
'aaaaabbbbbcccccw**ord*' 
'aaaaabbbbbccccc*word*' 

,我需要從最終刪除一些字符串(字符串2)這些字符串以及字符串2中的任何*字符以及*前面的字符串2和後面的字符串2。 string2是一些變量。我想不出可以在這裏使用的正則表達式。

//wrong example, * that might happen to be inside of $string1 are not removed :(
$string1 = 'aaaaabbbbbcccccw**ord*'; 
$string2 = 'word'; 
$result = preg_replace('#\*?' . $string2 . '\*?$#', '', $string1); 

有人可以建議一個PCRE正則表達式嗎?

附:我可以得到upvoted喜歡列表15點嗎?所以我可以讓人們高興?

+0

輸入字符串不包含任何搜索字符串'test' – anubhava

+0

這是一個錯字。 – Dannyboy

回答

1
$regexp = '#\**' . implode('\**', str_split($string2)) . '\**$#'; 
$result = preg_replace($regexp, '', $string1); 

DEMO

str_split拆分串成字符,然後implode插入它們中的每之間\**。然後我們把\**之前和之後抓住任何周圍的*個字符。

+0

謝謝!這也工作。 – Dannyboy

+0

這兩個答案在處理單詞前後多個'*'的方式上有所不同。我的答案將刪除所有這些,@ anubhava的答案將只匹配一個可選的'*'在每一端。 – Barmar

+0

但是你的早期版本使用array_map是不是? – anubhava

2

這裏是這樣做的一種方式:

$string1 = 'aaaaabbbbbcccccw**ord*'; 
$string2 = 'word'; 
$result = preg_replace('#\*?' . implode('\**', str_split($string2)) . '\*?$#', '', 
         $string1); 
echo $result; 
//=> aaaaabbbbbccccc 
+0

謝謝。這工作。 – Dannyboy

相關問題