我試圖從字符串中刪除所有前導,尾隨和獨立連字符:PHP正則表達式 - 刪除所有領導,尾隨和獨立連字符
-on-line - auction- website
期望的結果:
on-line auction website
我來了up with a working solution:
^-|(?<=\s)-|-(?=\s)|-$
但它在我看來是一個有點業餘愛好者(不是嗎?)。 那麼你有更好的解決方案?
我試圖從字符串中刪除所有前導,尾隨和獨立連字符:PHP正則表達式 - 刪除所有領導,尾隨和獨立連字符
-on-line - auction- website
期望的結果:
on-line auction website
我來了up with a working solution:
^-|(?<=\s)-|-(?=\s)|-$
但它在我看來是一個有點業餘愛好者(不是嗎?)。 那麼你有更好的解決方案?
您可以使用此模式:
(?<!\S)-|-(?!\S)
例如:
echo preg_replace('~(?<!\S)-|-(?!\S)~', '', '-on-line - auction- website');
另一種可能的模式:-(?(?<!\S.)|(?!\S))
有沒有理由你必須在一個正則表達式中做所有事情。將它分成兩三個。
s/^-\s*//; # Strip leading hyphens and optional space
s/\s*-$//; # Strip trailing hyphens and optional space
s/\s+-\s+/ /; # Change any space-hyphen-space sequences to a single space.
這就是sed/Perl語法。您將相應地調整preg_replace語法。
我想這可以縮短爲:
$repl = preg_replace('/(^|\s)-|-(\s|$)/', '$1$2', $str);
你可以嘗試以下方法:
-(?!\w)|(?<!\w)-
這無論後面是什麼破折號不是單詞字符匹配,或一個破折號,前面是一些不是單詞字符的東西。
或者,如果你想要,否則,匹配不在兩個單詞字符之間的所有破折號。
在PHP中您可以使用trim
和rtrim
刪除任何字符從字符串的開頭和結尾開始的動作。之後,您可以使用str_replace
從中間刪除-
。
$string = '-on-line - auction- website';
$string = trim($string, "-");
$string = rtrim($string,"-");
$string = str_replace("- ", " ", $string);
$string = str_replace(" ", " ", $string); //remove double spaces left by " - "
var_dump($string);
結果:
string(24) "on-line auction website"
您可以堆棧成一條線,如果你想:
$string = $string = str_replace(" ", " ", str_replace("- ", " ", rtrim(trim($string, "-"),"-")));
這不會刪除' - ''中'拍賣方式的 – Toto
OP需要準確定義「獨立連字符」的含義。這裏的關鍵是沒有必要,而且實際上更容易混淆,試圖在一個正則表達式中做所有事情。 –