2013-11-26 23 views
3

我試圖從字符串中刪除所有前導,尾隨和獨立連字符:PHP正則表達式 - 刪除所有領導,尾隨和獨立連字符

-on-line - auction- website 

期望的結果:

on-line auction website 

我來了up with a working solution

^-|(?<=\s)-|-(?=\s)|-$ 

但它在我看來是一個有點業餘愛好者(不是嗎?)。 那麼你有更好的解決方案

回答

3

您可以使用此模式:

(?<!\S)-|-(?!\S) 

例如:

echo preg_replace('~(?<!\S)-|-(?!\S)~', '', '-on-line - auction- website'); 

另一種可能的模式:-(?(?<!\S.)|(?!\S))

2

有沒有理由你必須在一個正則表達式中做所有事情。將它分成兩三個。

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語法。

+1

這不會刪除' - ''中'拍賣方式的 – Toto

+0

OP需要準確定義「獨立連字符」的含義。這裏的關鍵是沒有必要,而且實際上更容易混淆,試圖在一個正則表達式中做所有事情。 –

3

我想這可以縮短爲:

$repl = preg_replace('/(^|\s)-|-(\s|$)/', '$1$2', $str); 
2

你可以嘗試以下方法:

-(?!\w)|(?<!\w)- 

這無論後面是什麼破折號不是單詞字符匹配,或一個破折號,前面是一些不是單詞字符的東西。

或者,如果你想要,否則,匹配不在兩個單詞字符之間的所有破折號。

Regex101 Demo

1

在PHP中您可以使用trimrtrim刪除任何字符從字符串的開頭和結尾開始的動作。之後,您可以使用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, "-"),"-"))); 
相關問題