【问题标题】:Want to find and remove word only from string using - PHP只想使用 - PHP 从字符串中查找和删除单词
【发布时间】:2012-01-13 13:07:00
【问题描述】:

我特别需要从字符串中删除单词,但是当该单词有点 (.) 字符时我遇到了问题。

让我们看看这里是字符串,到目前为止我尝试了什么?

$result = 'Hello Ka Kashish.';
$result = preg_replace('/\bKa\b/i', '', $result);

我会得到预期的结果'Hello Kashish.'

但如果字符串如下所示,则无法正常工作

$result = 'Hello Ka. Kashish.';
$result = preg_replace('/\bKa.\b/i', '', $result);

它给了我结果'Hello Ka. Kashish.' 为什么这个 .(dot) 不起作用? 请给我解决方案。

如果我能以任何其他方式删除这个词,请告诉我。 我只想删除单词而不是字符集,因为“Ka”这个词将被删除,但“Ka”不会从“Kashish”中删除。 请帮帮我。

提前致谢

【问题讨论】:

  • 即使转义点也不行

标签: php regex string string-parsing


【解决方案1】:

这是因为点可以匹配任何字符。

同样的问题是\b确实匹配了一个单词边界,即一个单词字符后面跟着一个非单词字符的位置,或者一个非单词字符后面跟着一个单词字符的位置。但由于点不是单词字符,也不是空格,所以它不会匹配。

也许你应该尝试一下:

preg_replace('/\bKa(\W|$)/i', '', $result)

【讨论】:

  • 是的,没错:\b 将不匹配。本质上,您想删除单词后面的任何标点符号?
  • 我应该这样尝试吗? preg_replace('/\bKa\b\./i', '', $result);
  • 是的更新版本正在运行,哪些字符将与 (\W|$)) 匹配?
  • \W 将匹配任何 单词字符的字符(它与 \w 完全相反),$ 将匹配输入。我必须使用(...) 对其进行分组,而| 是一个替代项(re1|re2 表示“匹配re1re2)。
【解决方案2】:

原因是\b代表一个词的边界。 IE。单词字符和非单词字符之间的边界。见http://www.regular-expressions.info/wordboundaries.html

句号“。”之间的边界。并且空格“”不是单词边界,因此模式匹配失败。两者都不 ”。”也不是反斜杠“。”将工作。您需要删除第二个“\b”。

另外,“。”表示“任何字符”,所以使用反斜杠“.”的目的。正如其他人指出的那样,是确保它只匹配句号。在重新设计模式以使其在没有第二个“\b”的情况下工作时要注意这一点。

【讨论】:

  • 删除第二个 \b 是否有效?它不会删除任何非单词字符,例如“kashish”中的“ka”。对吗?
  • 它可能会,这取决于你如何重新设计你的模式。正如其他人所说,您可能需要一个匹配替代品的模式。 “K a。”或“Ka\b”或“Ka”或“Ka$”即“Ka(\.|\b| |$)”
  • 其他可以尝试的可能是:- "Ka\.?(\b| |$)" 或 "Ka(\b|\.(\B|$)|$)"
  • 我应该纠正我的最后一个,因为它会留在“。”因为替补的顺序。试试“/(^|\b)Ka(\.(\b|\B|$)|\b|$)/i”
  • 抱歉,简化版 "/(^|\b)Ka(\.|\b|$)/i" 隐含了 "."如果可用,将首先选择替代品。
【解决方案3】:

您需要转义点,即 .而不是。

preg_replace('/\bKa\.\b/i', '', $result); 

【讨论】:

    【解决方案4】:

    也许这会按照你想要的方式工作?

    preg_replace('/\bKa[\.]?(\s|$)/i', '', $result);
    

    【讨论】:

      【解决方案5】:

      这是一个适用于您的情况的基于前瞻的正则表达式:

      $result = 'Ka. Hello Ka. Kashish. Ka.';
      $result = preg_replace('/(?<=\b)Ka\.(?=(\W|$))/i', '', $result);
      

      输出:

      string(17) " Hello  Kashish. "
      

      【讨论】:

        【解决方案6】:

        rtrim 用于从字符串的右侧删除选定的字符。

        下面是一个如何去除句尾点的例子:

        $result1=rtrim($result, '.');
        echo $result1;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-21
          • 2023-01-26
          • 2021-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多