0

我如何https://domain.com/gamer?hid=.115f12756a8641从下面的字符串中提取,即从url

rrth:'http://www.google.co',cctp:'323',url:'https://domain.com/gamer?hid=.115f12756a8641',rrth:'https://another.com'

Ps:我是正则表达式的新手,我正在学习。但是上面的字符串似乎是格式化的..所以必须有某种快捷方式。

4

2 回答 2

4

如果您的输入字符串被调用$str

preg_match('/url:\'(.*?)\'/', $str, $matches);
$url = $matches[1];

(.*?)捕获url:'和之间的所有内容,'以后可以使用$matches[1].

?尤其重要。它使重复变得不贪婪,否则它将消耗一切直到最后'

如果您的实际输入字符串包含多个url:'...'部分,请preg_match_all改用。$matches[1]然后将是所有必需值的数组。

于 2012-10-23T16:15:31.717 回答
0

简单的正则表达式:

preg_match('/url\s*\:\s*\'([^\']+)/i',$theString,$match);
echo $match[1];//should be the url

这个怎么运作:

/url\s*\:\s*: 匹配url+ [任意数量的空格] + :(冒号)+ [任意数量的空格]
但是我们不需要这个,这就是第二部分的来源
\'([^\']+)/i:匹配',然后括号 ( ()) 创建一个,这将是单独存储在$matches数组中。将匹配的是[^']+:任何字符,除了撇号([]创建一个字符类,^意思是:排除这些字符)。所以这个类将匹配任何字符,直到它到达结束/定界撇号为止。
/i:如果字符串可能包含URL:'http://www.foo.bar',我添加了 that i,这是不区分大小写的标志。

就是这样。
也许你可以在这里闻一闻以更好地理解正则表达式

注意:我不得不转义单引号,因为模式字符串使用单引号作为分隔符:"/url\s*\:\s*'([^']+)/i"同样有效。如果您不知道天气,您将处理单引号或双引号,您可以将引号替换为另一个 char 类:

preg_match('/url\s*\:\s*[\'"]([^\'"]+)/i',$string,$match);

显然,在这种情况下,您必须转义用于模式字符串的分隔符......

于 2012-10-23T16:22:40.127 回答