在PHP中捕获2个特定字符之间的字符串的最佳方法是什么?在线查看时,有人说要爆炸,有人建议使用str_函数,有人建议使用正则表达式,
:>Test!1.221ddba.0_31df0888d4d13e9456a2bdafc93437ff@~127.0.0.1 JOIN UUNN :%#Test
我希望捕获:
和!
之间的字符串,即>Test
。我该如何使用正则表达式执行此操作,或者有更简单的方法?
答案 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);
答案 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]);
?>
是贪婪的量词