簡體   English   中英

PHP regexp - 刪除所有前導,尾隨和獨立連字符

[英]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)-

這可以匹配破折號,后面跟不是單詞字符的東西,或者前面跟不是單詞字符的破折號。

或者,如果您想要另外設置,請匹配不在兩個單詞字符之間的所有短划線。

Regex101演示

在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, "-"),"-")));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM