2013-11-01 15 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

相关问题