我有test.php并在test1.php我运行了这个PHP代码
<?php
$Text=file_get_contents("http://inviatapenet.gethost.ro/sop/test.php");
preg_match_all('~fid="(.*?)"~si',$Text,$Match);
$fid=$Match[1][1];
echo $fid;
?>
我想要做的是从test.php获取文本
从这个fid ='gty5etrf'JavaScript我只需要fid的内容
<script type='text/javascript'>fid='gty5etrf'; v_width=620; v_height=490;</script><script type='text/javascript' src='http://www.reyhq.com/player.js'></script>
在test1.php中,我只需要显示内容
gty5etrf
我必须做什么?
答案 0 :(得分:2)
您可以尝试使用fid\=\'([^\']+)\'
表达式,因为[^\']+
以正确的方式使表达式非贪婪,同样,表达式错误,因为它正在寻找双引号而不是单引号。< / p>
答案 1 :(得分:2)
preg_match_all('/fid=\'([^\']+)\'/',$Text,$Match);
你的正则表达式错了。
首先,您正在寻找fid="..."
而不是fid='...'
。
其次,对于.*
,正则表达式将匹配除fid
属性末尾之外的任何字符。
以下是完整代码:
preg_match_all('/fid=\'([^\']+)\'/',$Text,$Match);
$fid=$Match[1][0];
echo $fid;
答案 2 :(得分:0)
这应该是
$fid=$Match[1][0];
而不是:
$fid=$Match[1][1];
答案 3 :(得分:0)
匹配''
内的字符串:'(?:[^\\']*|\\.)*'
匹配""
内的字符串:"(?:[^\\"]*|\\.)*"
他们两个(忽略空格):fid\s*=\s*('(?:[^\\']*|\\.)*'|"(?:[^\\"]*|\\.)*")
为php转义:
$regexp = '~fid\\s*=\\s*(\'(?:[^\\\\\']*|\\\\.)*\'|"(?:[^\\\\"]*|\\\\.)*")~';
即使这样也能正确处理:
fid = 'foo\'s bar';
答案 4 :(得分:0)
一个简短的模式:
$pattern = '~\bfid\s*=\s*["\']\K\w+~';
或长图案:
$pattern = '~<script[^>]*>(?:[^f<]+|\Bf+|f(?!id\b)|<+(?!/script>))*+\bfid\s*=\s*(["\'])\K[^"\']+(?=\1)~';
结果
preg_match($pattern, $Text, $match);
$fid = $match[0];
短模式找到如下序列:
fid='somechars
fid = "somecchars
长模式也是如此,但也检查你是否在脚本标记之间。
使用XPath:
$html = <<<'EOD'
<script type='text/javascript'>fid='gty5etrf'; v_width=620; v_height=490;</script><script type='text/javascript' src='http://www.reyhq.com/player.js'></script>
EOD;
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML($html);
$xp = new DOMXPath($dom);
$query = <<<'EOD'
substring-before(
substring-after(
//script[contains(., "fid='")],
"fid='"
),
"'"
)
EOD;
echo $xp->evaluate($query);