【问题标题】:How do I extract a word between pipes using regex in PHP?如何在 PHP 中使用正则表达式在管道之间提取单词?
【发布时间】:2012-08-20 17:52:22
【问题描述】:

我正在编写一个解析器,我需要使用 php 提取双管道之间的单词

例如我想从下面的字符串中提取“ipsum”

Lorem ||ipsum|| blah

如果双管道之间有多个单词,也应该将它们提取出来

澄清

当我说多个词时,我不是这个意思:||另一个词||

我的意思是这个

||Word1|| blah blah (newline)
blah ||Word2||

说明第 2 部分

the ||quick|| brown fox ||jumps|| over the lazy ||dog|| 

应该提取的应该是'quick'、'jumps'和'dog'这些词

很抱歉给您带来了困惑...下面可能有一些正确的答案,我会在明天上班确认后选择一个:)

【问题讨论】:

  • 正则表达式是否会比 || 上的正常拆分更有效地完成此问题可以吗?
  • 文本不是竖线分隔的,它是一个多行文件,可能包含多个位于双竖线之间的特殊单词。分解它可以工作,但如果有一个单行解决方案而不是循环文件以确保单词不在不同行的管道之间,我更喜欢它
  • 我对您实际寻找的内容感到非常困惑:S 并且示例无济于事

标签: php regex


【解决方案1】:

简单的呢

$array = explode('||', $string);

之后,您可能希望使用 trim() 修剪数组值。

另请参阅http://www.php.net/explodehttp://www.php.net/trim

【讨论】:

  • 请注意,结果数组中只有奇数索引应计为“管道之间”。
【解决方案2】:

这是一个正则表达式解决方案:http://regex101.com/r/vE9pY9

 /\Q||\E[^|]+\Q||\E/

这不会接受管道作为单词的一部分。如果这是要求,则必须重新制作正则表达式。

【讨论】:

  • \Q 是“引用”的开始,\E(可选)结束先前开始的引用块。正如您在 regex101.com 的解释中看到的那样,\Q\E 中的字符 || 被逐字处理。它不太常见,但是当我必须转义几个字符时会使用它。大大提高了可读性。
【解决方案3】:

试试这个:

if(preg_match('/\|\|(.*)\|\|/', $str, $matches) === 1){
    echo $matches[1];
}

或者如果有多个||,试试这个:

if(preg_match_all('/\|\|(.*?)\|\|/', $str, $matches) !== FALSE){
    print_r($matches[1]);
}

【讨论】:

  • 这和我的表达之间的区别在于,这将允许|||word|| 结构内,但它也会弄乱一个字符串,例如:it will ||fail|| right ||here||. trust me。见:regex101.com/r/kZ0tO6
  • @Lindrian:这取决于 OP 想要什么。我的正则表达式将提取fail|| right ||here
  • 正确。我以为他确实想要那个,但谁知道呢。现在他有两种解决方案可供选择:)!
  • 抱歉给您带来了困惑...失眠会这样做:/我想要的是字符串 'it will ||fail||对||这里||。相信我提取“失败”和“这里”这两个词
  • @Rocket 谢谢!一旦我明天确认,我会接受你的回答,因为我现在无法弄清楚:)
【解决方案4】:

我想我知道你在寻找什么:

\|\|[a-zA-Z0-9]+\|\|

这应该满足你的例子:

||Word1|| blah blah (newline)
blah ||Word2||

挑选出 Word1 和 Word2。

您需要去掉两边的||

还有一种方法可以使用正则表达式来去除||,但 KISS。通常,以后删除这些内容更容易阅读和更容易。所以你有一个简单的正则表达式和一个简单的修剪。

希望对你有帮助,

【讨论】:

    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 2019-12-31
    相关资源
    最近更新 更多