![](/img/trans.png)
[英]Remove multiple trailing hyphens PHP Regex (not covered by “.” character???)
[英]PHP regexp - remove all leading, trailing and standalone hyphens
我正在嘗試從字符串中刪除所有前導,尾隨和獨立連字符:
-on-line - auction- website
期望的結果:
on-line auction website
我提出了一個有效的解決方案 :
^-|(?<=\s)-|-(?=\s)|-$
但它看起來有點業余(不是嗎?)。 那你有更好的解決方案嗎?
您可以使用此模式:
(?<!\S)-|-(?!\S)
例:
echo preg_replace('~(?<!\S)-|-(?!\S)~', '', '-on-line - auction- website');
另一種使用條件語句的可能模式: -(?(?!\\S)|(?<!\\S.))
最后一個很有趣,因為它有一個具有前導文字字符的單個分支的好處。 這樣,正則表達式引擎能夠快速測試字符出現的字符串中的位置(由於在“正常”正則表達式引擎步行之前的內部優化)。
請注意,條件語句不是必需的,也可以替換為非捕獲組添加:
它不會更改結果,但會更長):
-(?:(?!\S)|(?<!\S.))
我猜它可以縮短為:
$repl = preg_replace('/(^|\s)-|-(\s|$)/', '$1$2', $str);
沒有理由你必須在一個正則表達式中做所有事情。 將它分成兩個或三個。
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語法。
您可以嘗試以下方法:
-(?!\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, "-"),"-")));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.