PHP捕获字符之间的字符串

时间:2019-01-31 08:10:44

标签: php regex

在PHP中捕获2个特定字符之间的字符串的最佳方法是什么?在线查看时,有人说要爆炸,有人建议使用str_函数,有人建议使用正则表达式,

:>Test!1.221ddba.0_31df0888d4d13e9456a2bdafc93437ff@~127.0.0.1 JOIN UUNN :%#Test

我希望捕获:!之间的字符串,即>Test。我该如何使用正则表达式执行此操作,或者有更简单的方法?

2 个答案:

答案 0 :(得分:0)

这是带有RegEx的PHP。也许有帮助:)

$re = '/(?<=:).*(?=!)/';
$str = ':>Test!1.221ddba.0_31df0888d4d13e9456a2bdafc93437ff@~127.0.0.1 JOIN UUNN :%#Test';
preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);
// Print the entire match result
var_dump($matches);

Link to Regex101.com

答案 1 :(得分:0)

在修改了我已经找到的答案之后,我想到了这个RegEx

/(?<=:)[^:!]*(?=!)/miu

正则表达式说明

(?<=:)-向后寻找肯定值,以确保:确实符合条件
[^:!]*-多次匹配:!以外的任何字符。
(?=!)-积极向前看,确保从字面上看!

一些基本说明

上面的正则表达式实际上不仅抓取:!之间的每个符号,而且还确保在这两个符号之间没有:或{{1 }}。
实际上,它仅处理严格在!:之间的文本。其他所有内容都不匹配。如果根本没有!后跟:,那么结果将为空。

这已使用https://regex101.com/进行了测试。

为测试生成的Php代码为

!

编辑

我确实尽力使它变得不贪婪,但是<?php $re = '/(?<=:)[^:!]*(?=!)/m'; $str = ':ssuguwuug!jsgejjgjj!yhjyt:feeeeeg!uuuuuuu:uuuuu:uuu!'; preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0); // Print the first match result, since it looks like OP only wanted a first match var_dump($matches[0]); ?> 是贪婪的量词