【问题标题】:PHP Capture string between charactersPHP捕获字符之间的字符串
【发布时间】:2019-06-24 15:24:00
【问题描述】:

在 PHP 中捕获 2 个特定字符之间的字符串的最佳方法是什么?网上看有人说要炸,有人建议用str_函数,有人建议用regex,

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

我希望捕获:! 之间的字符串,即>Test。我如何使用正则表达式来做到这一点,或者有更简单的方法吗?

【问题讨论】:

标签: php regex


【解决方案1】:

在修改了我已经找到的答案后,我想出了这个正则表达式

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

正则表达式解释

(?<=:) - 正向查找确保前面的内容匹配 : 字面意思
[^:!]* - 匹配除 :! 之外的任何字符任意次数。
(?=!) - 正向查找确保接下来是! 字面意思。

有点基本的解释

上面的正则表达式实际上不仅抓住了:! 之间的每个符号,而且还确保在这两个符号之间没有:! 的其他出现。
实际上,它只处理严格介于:! 之间的文本。其他一切都不匹配。如果根本没有: 后跟!,则结果将为空。

这是使用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]);

?>

编辑

我真的尽量让它不贪心,但* 是一个贪心量词

【讨论】:

    【解决方案2】:

    这里是带有 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

    【讨论】:

    • 这看起来很贪心。如果字符串包含非预期的:! 符号,它也会返回错误结果
    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2023-03-06
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2014-12-04
    相关资源
    最近更新 更多