3

我有test.phptest1.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

我必须做什么?

4

5 回答 5

2

您可以尝试该表达式fid\=\'([^\']+)\',因为[^\']+它以正确的方式使表达式非贪婪,而且该表达式是错误的,因为它正在寻找双引号而不是单引号。

于 2013-04-16T09:32:38.220 回答
2
 preg_match_all('/fid=\'([^\']+)\'/',$Text,$Match);

你的正则表达式是错误的。首先,您正在寻找fid="..."而不是fid='...'. 其次,使用,正则表达式将匹配比 属性.*末尾更远的​​任何字符。fid

这是完整的代码:

preg_match_all('/fid=\'([^\']+)\'/',$Text,$Match);
$fid=$Match[1][0];
echo $fid;
于 2013-04-16T09:33:09.707 回答
0

这应该是

$fid=$Match[1][0];

代替 :

$fid=$Match[1][1];
于 2013-04-16T09:35:33.573 回答
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);
于 2013-04-16T10:31:28.210 回答
0

里面的匹配字符串'''(?:[^\\']*|\\.)*'

里面的匹配字符串"""(?:[^\\"]*|\\.)*"

他们两个(忽略空格):fid\s*=\s*('(?:[^\\']*|\\.)*'|"(?:[^\\"]*|\\.)*")

并为 php 转义:

$regexp = '~fid\\s*=\\s*(\'(?:[^\\\\\']*|\\\\.)*\'|"(?:[^\\\\"]*|\\\\.)*")~';

即使这样,这也将正确处理:

fid  = 'foo\'s bar';
于 2013-04-16T09:37:50.817 回答