【问题标题】:Remove last two words from a string从字符串中删除最后两个单词
【发布时间】:2016-02-16 19:37:17
【问题描述】:

我对@9​​87654321@ 完全陌生,但是下面的代码从我的字符串中删除了最后一个单词:

preg_replace('/\W\w+\s*(\W*)$/', '$1', $var);

我正在尝试修改它,以便它删除最后 两个 单词。

我唯一能想到的是将$1 替换为$2,但这似乎根本没有任何效果,可能只是愚蠢:/

有问题的字符串看起来像这样:

Lorem ipsum dolor sit amet. Source: LOREM

我想删除Source: LOREM

【问题讨论】:

  • 你如何定义一个词?哪些字符可以分隔单词?
  • $1 不是指数量,而是指序数。这是您的第一个匹配序列。
  • @YetAnotherGeek 查看我更新的问题
  • 这个字符串的预期输出是什么:“我喜欢奶酪吗?不。”
  • 或者您可以运行两次删除最后一个单词的例程。

标签: php string preg-replace


【解决方案1】:

一个简单的正则表达式可以匹配一个空格,后跟任意数量的字母(或冒号),后跟一个空格,然后是字符串末尾的任意数量的字母:

$str = "Lorem ipsum dolor sit amet. Source: LOREM";
$str = preg_replace( "/\s[a-z:]+\s[a-z]+$/i", "", $str );

// Lorem ipsum dolor sit amet.
echo $str;

表达式分解如下:

\s       // Single space
[a-z:]+  // Any letter, a to z, or a colon, 1 or more times
\s       // Single space
[a-z]+   // Any letter, a to z, 1 or more times
$        // End of string

演示:http://codepad.org/G22LnDDY

另一种方法是使用explode 创建一个单词数组,并删除最后两个。

$str = "Lorem ipsum dolor sit amet. Source: LOREM";
$words = explode( " ", $str );
array_splice( $words, -2 );

// Lorem ipsum dolor sit amet.
echo implode( " ", $words );

演示:http://codepad.org/6XwqvwuP

【讨论】:

  • 感谢所有答案,但似乎没有一个有效(Source: Lorem 未被删除)。这很奇怪,因为只删除 1 个单词的代码可以正常工作。它可能与我的代码有关。我会继续尝试,如果我没有修复它,我将使用代码 sn-p 更新我的问题。如果我现在不接受任何答案,我希望没关系。
  • @Andrej 上述两种方法都有效。再次检查您的代码。我提供了两个功能演示的链接,您可以使用它们。
  • 非常感谢您的努力,乔纳森。 Codepad.org 看起来是测试我的整个 sn-p 的好方法!我相信我迟早会让它工作的! p.s.问题可能是我有多个字符串,并且我确实在 for each 循环中使用了表达式吗?
  • @Andrej 向我提供您的设置的键盘链接,我会通知您。
  • 我把它放在网上codepad.org/9ShnX8xP。但是整个代码在那里不起作用,因为缺少一个文件(simplehtmldomparser)。如果您也需要我包括那个,请告诉我!再次感谢您抽出宝贵时间查看它!
【解决方案2】:

你没有在这里使用正则表达式。假设您将单词定义为任何被空格包围的东西:

$words = explode(' ', 'Lorem ipsum dolor sit amet. Source: LOREM');
if (count($words) >= 2) {
    array_pop($words);
    array_pop($words);
}
$words = implode(' ', $words);

或者:

$words = explode(' ', 'Lorem ipsum dolor sit amet. Source: LOREM');
if (count($words) >= 2) {
    $words = array_slice($words, 0, count($words) - 2);
}
$words = implode(' ', $words);

【讨论】:

  • 感谢所有答案,但似乎没有一个有效(Source: Lorem 未被删除)。这很奇怪,因为只删除 1 个单词的代码可以正常工作。它可能与我的代码有关。我会继续尝试,如果我没有修复它,我将使用代码 sn-p 更新我的问题。如果我现在不接受任何答案,我希望没问题。
【解决方案3】:
$str = ' would like to remove Source: LOREM';
$str =  preg_replace('/(.*)\s+([a-zA-Z]+):\s+([a-zA-Z]+)$/', '$1', $str);
echo $str;

【讨论】:

    【解决方案4】:

    $1,实际上是用于替换的分组捕获,因此可以将其视为 $n,$n+1。您的正则表达式中只有 1 组括号()。所以你需要第二组。如果您实际上不需要换掉某些东西,则可以使用更有针对性的方法。

    .*(?=\s\D+\s)

    应该让你更接近。 另外,我的救生员(真的可以节省时间)是http://regexpal.com/ 没有它,我不会编写 RegEx 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2016-01-21
      • 2016-01-21
      • 2015-06-08
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多