获取站点名称的正则表达式需要更正

发布于 2024-11-29 23:08:12 字数 603 浏览 1 评论 0原文

问题:提取 http://www..com 之间的任何内容或 http:// & .com

解决方案:

<?php
$url1='http://www.examplehotel.com';
//$url2='http://test-hotel-1.com';
$pattern='@^http://([^/]+).com@i';
preg_match($pattern, $url1, $matches);
print_r($matches);
?>

当 $url1 匹配时,它应该返回字符串 'examplehotel'
当 $url2 匹配时,它应该返回字符串 'test-hotel-1'

它对于 $url2 正常工作,但对于 $url1 为空......

在我的模式中我想添加 [http://][http://www.] 我添加了 (http://)+(www.)+ 但预计不会返回匹配结果:(。

我可以吗知道我哪里出错了吗?

Problem: Extraction anything between http://www. and .com OR http:// & .com.

Solution:

<?php
$url1='http://www.examplehotel.com';
//$url2='http://test-hotel-1.com';
$pattern='@^http://([^/]+).com@i';
preg_match($pattern, $url1, $matches);
print_r($matches);
?>

When $url1 is matched it should return string 'examplehotel'
when $url2 is matched it should return string 'test-hotel-1'

It works correctly for $url2 but empty for $url1....

In my pattern I want to add [http://] or [http://www.] I added (http://)+(www.)+ but the match returns are not expected :(.

May I know where I am going wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

罪歌 2024-12-06 23:08:12

尝试这个:

$pattern='@^http://(?:www\.)?([^\.]+).com@i';

或者在您的模式中,您只需将 www 设为可选(可能会或可能不会出现在模式中):

$pattern='@^http://(?:www\.)?([^/]+).com@i';

try this one:

$pattern='@^http://(?:www\.)?([^\.]+).com@i';

or in your pattern you just need to make www optional (may or may not appear in pattern):

$pattern='@^http://(?:www\.)?([^/]+).com@i';
顾挽 2024-12-06 23:08:12

问题是,您正在匹配从两个斜杠到 .com 的所有内容。如果有 www.,您也可以在捕获组中匹配它。

解决方案是在捕获组之前匹配 www. ,例如

^http://(?:www\.)?([^/]+)\.com
        ^^^^^^^^^^       ^^

(?:www\.)? 这是一个非捕获组,即不存储内容在结果中。末尾的 ? 使其可选。

\. 将匹配文字“.”。 . 是正则表达式中的特殊字符,表示“任何字符”。

看这里在线Regexr,当你将鼠标悬停在字符串上时,你会看到捕获组的内容。

关于您对 [http://] 的尝试等等。当您使用方括号时,您正在创建一个字符类,这意味着匹配方括号内的字符之一。当您想要对字符进行分组时,请使用捕获 () 或非捕获 (?:) 组。

The problem is, that you are matching everything from the two slashes to the .com. If there is a www. you are matching this too, within your capturing group.

The solution is to match www. optionally before your capturing group, like this

^http://(?:www\.)?([^/]+)\.com
        ^^^^^^^^^^       ^^

(?:www\.)? This is a non capturing group, i.e. the content is not stored in the result. The ? at the end makes it optional.

\. will match a literal ".". . is a special character in regex and means "Any character".

See it here online on Regexr, When you hover your mouse over the strings, you will see the content of the capturing group.

Regarding your tries with [http://] and so on. When you use square brackets, then you are creating a character class, that means match one of the characters from inside the brackets. When you want to group the characters, then use a capturing () or a non capturing (?:) group.

心不设防 2024-12-06 23:08:12
preg_match_all('%http(?:s)?://(?:www\.)?(.*?)\.com%i', $url, $result, PREG_PATTERN_ORDER);
print_r($result[1])
preg_match_all('%http(?:s)?://(?:www\.)?(.*?)\.com%i', $url, $result, PREG_PATTERN_ORDER);
print_r($result[1])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文