如何在PHP中使用正则表达式在管道之间提取单词?

如何在PHP中使用正则表达式在管道之间提取单词?,php,regex,Php,Regex,我正在编写一个解析器,需要使用php提取双管道之间的单词 例如,我想从下面的字符串中提取“ipsum” Lorem ||ipsum|| blah 如果在双管道之间有多个单词,那么也应该提取它们 澄清 当我说多个词时,我不是这个意思:| |另一个词|| 我是说这个 ||Word1|| blah blah (newline) blah ||Word2|| 澄清第2部分 the ||quick|| brown fox ||jumps|| over the lazy ||dog|| 应该提取的单

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

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

Lorem ||ipsum|| blah
如果在双管道之间有多个单词,那么也应该提取它们

澄清

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

我是说这个

||Word1|| blah blah (newline)
blah ||Word2||
澄清第2部分

the ||quick|| brown fox ||jumps|| over the lazy ||dog|| 
应该提取的单词应该是“快速”、“跳跃”和“狗”

很抱歉给你带来困惑。。。下面可能有一些正确的答案,等我明天在工作中确认后,我会挑一个:)

简单的回答怎么样

$array = explode('||', $string);
之后,可能需要使用trim()修剪数组值


另请参见和这里有一个正则表达式解决方案:

不过,这不允许管道成为世界的一部分。如果这是一项要求,则必须重新生成正则表达式。

尝试以下操作:

if(preg_match('/\|\|(.*)\|\|/', $str, $matches) === 1){
    echo $matches[1];
}
或者,如果有多个
|
,请尝试以下操作:

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

我想我知道你在找什么:

\|\|[a-zA-Z0-9]+\|\|
这应该满足您的示例:

||Word1|| blah blah (newline)
blah ||Word2||
挑选单词1和单词2的方法

您需要将两边的
|
剥掉

有一种方法可以使用正则表达式将
|
也去掉,但是要亲吻。阅读起来更容易,一般来说,以后把这些东西去掉也更容易。所以你有一个简单的正则表达式和一个简单的修剪


希望有帮助,

正则表达式是否能比| |上的普通拆分更有效地完成此问题?文本不是管道分隔的,它是一个多行文件,可能包含多个双管道之间的特殊单词。分解它可能会起作用,但如果有一个单行解决方案,而不是在文件中循环,以确保单词不在不同行的管道之间,我宁愿它被您实际查找的内容弄糊涂了:S,示例没有帮助
\Q
是“引号”的开始,
\E
(可选)结束先前开始的报价块。正如您在regex101.com上的解释中所看到的那样,
\Q\E
中的字符按字面意思处理。它不太常见,但我在必须转义几个字符时使用它。增加可读性很多。这和我的表达式之间的区别是,这将允许
|
| | |
结构内部,但它也会弄乱像这样的字符串:
它将|失败| | |正确| | | |这里|。相信我
。看:@Lindrian:那取决于OP想要什么。我的正则表达式将在这里提取
fail | | | right |
。正确。我以为他不想那样,但谁知道呢。现在他有两种解决方案可供选择:)!很抱歉给你带来困惑。。。睡眠不足就会这样:/我想要的是字符串“it will | | | fail | | | | right | | | here | |”。相信我,把“失败”和“这里”这两个字摘录出来,谢谢!明天我确认后,我将接受您的答案,因为我现在无法计算:)请注意,结果数组中只有奇数索引应计为“管道之间”。
||Word1|| blah blah (newline)
blah ||Word2||