PHP使用RegEx获取字符串的子字符串

Posted

技术标签:

【中文标题】PHP使用RegEx获取字符串的子字符串【英文标题】:PHP Using RegEx to get substring of a string 【发布时间】:2011-08-21 23:02:31 【问题描述】:

我正在寻找一种使用 php 解析子字符串的方法,并且遇到了 preg_match 但是我似乎无法制定出我需要的规则。

我在解析一个网页,需要从字符串中抓取一个数值,字符串是这样的

producturl.php?id=736375493?=tm

我需要能够获取这部分字符串:

736375493

谢谢亚伦

【问题讨论】:

【参考方案1】:
$matches = array();
preg_match('/id=([0-9]+)\?/', $url, $matches);

如果格式发生变化,这是安全的。如果 URL 中有任何其他数字,则 slandau 的答案将不起作用。

php.net/preg-match

【讨论】:

感谢您的建议,我最初尝试了此代码,但没有成功,因此我将其调整为 preg_match('/id=(.*)\?/', $url, $matches);,现在可以完美运行。谢谢:)【参考方案2】:
<?php
$string = "producturl.php?id=736375493?=tm";
preg_match('~id=(\d+)~', $string, $m );
var_dump($m[1]); // $m[1] is your string
?>

【讨论】:

它在 $m[1] 中,因为(来自文档):“如果提供了匹配项,则将其填充为搜索结果。$matches[0] 将包含与完整模式,$matches[1] 将具有匹配第一个捕获的带括号的子模式的文本,依此类推。”【参考方案3】:
$string = "producturl.php?id=736375493?=tm";
$number = preg_replace("/[^0-9]/", '', $string);

【讨论】:

如果字符串类似于producturl.php?id=736375493?=tm&amp;page=2,您的$number 中会多出一个2。 非常正确,我假设他所有的字符串都是他发布的格式。 是的,这在字符串中给了我一个额外的数字,我刚刚尝试过这个在一定程度上有效。 preg_match('/id(.*)=', $body, $matches); 但它仍然在某些行的数字末尾给我 =tm。【参考方案4】:

不幸的是,您有一个格式错误的 url 查询字符串,因此正则表达式技术是最合适的。见what I mean。

不需要捕获组。只需匹配id=,然后用\K 忘记那些字符,然后隔离以下一个或多个数字字符。

代码 (Demo)

$str = 'producturl.php?id=736375493?=tm';
echo preg_match('~id=\K\d+~', $str, $out) ? $out[0] : 'no match';

输出:

736375493

【讨论】:

以上是关于PHP使用RegEx获取字符串的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

CUDA、Boost 和 Cmake “字符串子命令 REGEX,模式 MATCHALL 需要至少 5 个参数来命令。”

PB中取字符串子串的函数是啥

[在python中使用正则表达式搜索字符串子字符串

PHP/REGEX:获取括号内的字符串

字符串子串去重之后的个数

2022华为机试真题 C++ 实现 字符串子序列II