【问题标题】:Remove all Unicode dashes/hypens from text从文本中删除所有 Unicode 破折号/连字符
【发布时间】:2014-09-10 13:40:20
【问题描述】:

我正在尝试从文本中删除长破折号和普通破折号。我可以删除单个普通破折号,但长破折号有问题。我也可以删除它们,但它会导致文本中的数字出现问题。

例如文字:asdasd2 34 56 ——————————————-

我像[\u2014\-] 那样做正则表达式,这会删除所有长而普通的破折号,但也会删除所有数字。 [\-] 删除正常的破折号没有问题。

任何人都可以帮助正确的正则表达式吗?我想删除文本中所有类型的破折号,并将它们替换为空。

【问题讨论】:

  • $var = str_replace('—','',$string); 不起作用。它仅适用于 [ ] 括号。我试过[\—],但它不起作用。 [\-] 适用于普通破折号。 [\u2014] 适用于长破折号,但也会删除所有数字。
  • $remove = array('—', '-'); $test='asdasd2 34 56 ——————————————-'; echo str_replace($remove, '', $test);怎么样
  • var str = "asdasd2 34 56 ——————————————-".replace(/[\u2014\-]/g, ""); str;
  • var str = "asdasd2 34 56 ——————————————-".replace(/[\u2014\-]/g, ""); str; 在我的情况下不起作用。 [\u2014\-] 也删除所有数字。我认为应该在此正则表达式中添加其他内容以保留数字。

标签: javascript php regex


【解决方案1】:

下面的sn-p可以帮到你

<?php

$string = "asdasd2 34 56 ——————————————-";
$string = preg_replace("/(?:(?=—|\-).)+/", "", $string);
echo $string; // asdasd2 34 56

?>

下面的两个表达式也应该替换所有类型的连字符

[\p{Pd}]+
[\x{2010}-\x{2015}|\x{002D}|\x{2212}|\x{FE58}|\x{FE63}|\x{FF0D}]+

但由于某种原因,我收到了一个错误或带有这个奇怪字符 (�) 的字符串。这就是我想出第一个解决方案的原因。

【讨论】:

    【解决方案2】:

    请参阅Remove a long dash from a string in JavaScript?,了解如何匹配(替换或删除)JavaScript 中的任何破折号。

    在 PHP 中,使用 PCRE,您可以使用preg_replace

    $result = preg_replace('~[-\x{058A}\x{05BE}\x{1400}\x{1806}\x{2010}-\x{2015}\x{2053}\x{207B}\x{208B}\x{2212}\x{2E17}\x{2E1A}\x{2E3A}\x{2E3B}\x{2E40}\x{2E5D}\x{301C}\x{3030}\x{30A0}\x{FE31}\x{FE32}\x{FE58}\x{FE63}\x{FF0D}\x{10EAD}]~u', '', $string);
    

    PHP demo online

    $string = "Dashes: -﹣֊᐀᠆‐-–︲—﹘︱―⸺⸻⁓⸗⹀⹝〜゠⸚־−⁻₋〰?";
    echo "'" . preg_replace('~[-\x{058A}\x{05BE}\x{1400}\x{1806}\x{2010}-\x{2015}\x{2053}\x{207B}\x{208B}\x{2212}\x{2E17}\x{2E1A}\x{2E3A}\x{2E3B}\x{2E40}\x{2E5D}\x{301C}\x{3030}\x{30A0}\x{FE31}\x{FE32}\x{FE58}\x{FE63}\x{FF0D}\x{10EAD}]~u', '', $string) . "'";
    // => 'Dashes: '
    

    注意u 标志,它使 PCRE 引擎将输入视为 Unicode 代码点序列(而不是字节)(并且还启用 PCRE_UCP 标志)。

    【讨论】:

    • 请注意,使用\p{Pd} 来匹配所有类型的破折号是不够的。这是一个PHP demo,显示替换后仍有一些工件。
    【解决方案3】:

    假设我们在谈论php,因为你的正则表达式在js中工作

    试试这个:[\p{Pd}]+[\—\-]+

    这里\p{Pd} 匹配任何类型的连字符或破折号。见HERE

    输入:asdasd2 34 56 —————---—————————-------------

    输出:asdasd2 34 56

    【讨论】:

    • \p{Pd} 是我的第一个猜测/尝试,但在我得到一个像 asdasd2 34 56 �������������� 这样的奇怪字符串后我放弃了 \u 或 \\u 不受支持 - 你可以使用 \x {2014} 但是,我无法使用它删除连字符
    • 尝试打印字符串原样,看看字符是否正常显示。
    • 嗯,它们没有按预期显示。正如我之前所说:)
    • 编码已设置为 UTF-8。也许我应该换个新浏览器或试试 jQuery ;))
    【解决方案4】:

    您也可以使用字符本身而不是其 HexCode。

    'asdasd2 -34 56 ——————————————-'.replace(/[—-]/g, "")
    //output "asdasd2 34 56 "
    

    【讨论】:

    • PHP 中没有replace() 函数
    【解决方案5】:

    在php中标记所有长破折号和普通破折号:

    [\x{2014}-]+
    

    问题是 PHP 不支持 \uFFFF 来匹配 Unicode 码点。

    【讨论】:

      猜你喜欢
      • 2014-10-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多