php中正则表达式的快速帮助

php中正则表达式的快速帮助,php,regex,preg-match,Php,Regex,Preg Match,我一点也不精通正则表达式,但我需要从URL中去掉ID,这是一大块文本 URL如下所示: domain.com/path/ID\u转到这里 问题在于,其内部电子邮件的格式多种多样,包括: - <a href="http://www.domain.com/path/ID_GOES_HERE">http://www.domain.com/path/ID_GOES_HERE</a> - www.domain.com/path/ID_GOES_HERE - http://domai

我一点也不精通正则表达式,但我需要从URL中去掉ID,这是一大块文本

URL如下所示:

domain.com/path/ID\u转到这里

问题在于,其内部电子邮件的格式多种多样,包括:

- <a href="http://www.domain.com/path/ID_GOES_HERE">http://www.domain.com/path/ID_GOES_HERE</a>
- www.domain.com/path/ID_GOES_HERE
- http://domain.com/path/ID_GOES
_HERE

因此ID会变形。

这应该满足您的需要:

<?php
$matches = array();
preg_match_all('@domain\.com/path/((?:[a-z0-9_]|=\n)*)@i', $subject, $matches);
foreach ($matches[1] as $id) {
    $id = str_replace("=\n", '', $id);
    // Do your processing here.
}
试试这个正则表达式

/(?:https?:\/\/)?(?:www.)?domain.com/path/([\d\w]+(?:\=?(?:\(?:[\r\n]|\r\n|)(?:[\d\w]+)?)?)/

似乎与所有测试用例都匹配

如果域可以位于字符串中的任何位置,为什么要使用插入符号和美元符号?此外,OP还表示,ID中只能包含字母数字字符,因此不需要下划线。如果每个输入有多个匹配项,则可能需要更多EdoDodo发布的内容。如果id可以包含大写字母,则可能需要添加A-Z。谢谢,删除了下划线。克拉和美元符号将使匹配[0]变小:P我不确定他是否希望一个函数在包含多个匹配项的文本中循环,那么您的函数是否正确。如果他想在一块文本中搜索一个id,然后再搜索下一块文本等等,那么我的是。是的,很好。你说得对,我忘了大写字母。我现在不区分大小写了,谢谢你指出这一点。
preg_match('/^domain\.com\/path\/([a-zA-Z0-9]*)$/', $text, $matches = array());
if(isset($matches[1]))
  echo $matches[1];
/(?:https?:\/\/)?(?:www.)?domain.com/path/([\d\w]+(?:\=?(?:\(?:[\r\n]|\r\n|)(?:[\d\w]+)?)?)/