2013-11-01 31 views
0

我需要從用戶提供的輸入中去除'和'(單引號和雙引號),但只有當它位於打開和關閉括號內[]時......我不想剝奪任何東西從字符串其他如何使用preg_replace去掉一個字符,但只有當它位於一個包裝中時

所以這個:

[字體大小=「10」]

需要改變到

[字體大小= 10]

但這:

[字體大小= 10]牛說 「も」[/字體]

不會剝離任何東西。

此:

[字體大小= 「10」]牛說 「も」[/字體]

會改變此:

[字體大小= 10]牛說「哞哞」[/ font]

感謝您的幫助......

回答

0

你的情況是很容易的;(:

<?php 
$str1 = ' 
[font size="10"] 

needs to change to 

[font size=10] 

but this: 

[font size=\'10\'] my single quoted size is \'OK?\' 

[font size=10]The cow says "moo"[/font] 

would not strip anything. 

This: 

[font size="10"]The cow says "moo"[/font] 

would change to this: 

[font size=10]The cow says "moo"[/font] 
'; 
// 
$str1 = preg_replace('/=[\'"]\s?([^\'"]*)\s?[\'"]/', '=$1', $str1); 

echo "<pre>"; 
echo $str1; 
echo "</pre>"; 
?>  

正則表達式中使用:

=[\'"]\s?([^\'"]*)\s?[\'"] 

等號的字符串startig =後跟由空格或之前沒有雙/單引號...

0

快變體,它來到了我的心(注PHP 5.3語法):

$s = preg_replace_callback('/(\\[[^\\]]+])/', function ($match) { 
     return str_replace(['"', '\''], ['', ''], $match[1]); 
    }, $s); 
1

你可以這樣做:

$result = preg_replace('~(?>\[|\G(?<!^)[^]"\']++)\K|(?<!^)\G["\']~', '', $string); 

解釋:

(?>   # open a group 
    \[   # literal [ 
    |   # OR 
    \G(?<!^) # contiguous to a precedent match but not at the start of the string 
    [^]"\']++ # all that is not quotes or a closing square bracket 
)\K   # close the group and reset the match from results 
|    # OR 
(?<!^)\G["\'] # a contiguous quote 

有了這種模式,僅報價將被替換,因爲括號內所有其他內容從比賽結果中移除。

+0

偉大的解決方案,這就是爲什麼我調用regexp「只寫」表達式:) –

相關問題