案例选择基于preg_match

时间:2011-09-14 19:16:44

标签: php

我有一个表单,当一个网址放在表单中并点击按钮时,URL就会被处理,并根据pregmatch提取一个URL。当找到其中一个匹配时,其他人会返回错误Notice: Undefined offset: 1我该怎样才能做到这一点,如果找到一个匹配,其他人没有给出错误?

if ( !isset( $_GET['go'] ) ) return;
$userLink =  $_GET['go'] ;
if ( !$userLink ) return;

$data = file_get_contents($userLink);
preg_match("@^(?:\s)*var url = '(.*)';@mi",$data, $parsed1);
preg_match("@^(?:\s)*self.location = '(.*)';@mi",$data, $parsed2);
preg_match("@^(?:\s)*window.location = \"(.*)\";@mi",$data, $parsed3);
preg_match("@^(?:\s)*Lbjs.TargetUrl = '(.*)';@mi",$data, $parsed4);
preg_match("@^(?:\s)*linkDestUrl = '(.*)';@mi",$data, $parsed5);

echo 'var.url - ' . $parsed1[1] . '<br>';
echo 'self.location - ' . $parsed2[1] . '<br>';
echo 'window.location - ' . $parsed3[1] . '<br>';
echo 'Lbjs.TargetUrl - ' . $parsed4[1] . '<br>';
echo 'linkDestUrl - ' . $parsed5[1];

5 个答案:

答案 0 :(得分:0)

您需要做的就是在打印前检查元素是否已设置:

echo 'var.url - ' . (isset($parsed1[1]) ? $parsed[1] : 'not found') . '<br>';
echo 'self.location - ' . (isset($parsed1[2]) ? $parsed[2] : 'not found') . '<br>';
echo 'window.location - ' . (isset($parsed1[3]) ? $parsed[3] : 'not found') . '<br>';
echo 'Lbjs.TargetUrl - ' . (isset($parsed1[4]) ? $parsed[4] : 'not found') . '<br>';
echo 'linkDestUrl - ' . (isset($parsed1[5]) ? $parsed[5] : 'not found');

答案 1 :(得分:0)

您可以尝试捕获preg_match的结果,如果未找到匹配项,则返回0。来自php docs

  

preg_match()返回模式匹配的次数。那将是   0次(不匹配)或1次

类似的东西:

if(preg_match("@^(?:\s)*var url = '(.*)';@mi",$data, $parsed1)) {
  if(!empty($parsed1[1])) { echo 'var.url - ' . $parsed1[1] . '<br>'; }
}

答案 2 :(得分:0)

我假设只有一种网址类型匹配,而不是两种或更多?

if ( !isset( $_GET['go'] ) ) return;
$userLink =  $_GET['go'] ;
if ( !$userLink ) return;

$data = file_get_contents($userLink);

$array = array(

  'var url',
  'self.location',
  'window.location',
  'Lbjs.TargetUrl',
  'linkDestUrl',

);

foreach ($array as $value)
{

  if (preg_match("@^(?:\s)*($value) = '(.*)';@mi",$data, $parsed))
  {
    break;
  }

}

echo $parsed[1] . ' - ' . $parsed[2] . '<br>';

答案 3 :(得分:0)

您可以在每个preg_match语句之前放置一个@。 @抑制错误消息,因此在使用它时要小心。

@preg_match("@^(?:\s)*var url = '(.*)';@mi",$data, $parsed1);

答案 4 :(得分:0)

if (preg_match("@^(?:\s)*(var url|self.location|window..location|Lbjs.TargetUrl|linkDestUrl) = ['\"](.*)[\"'];@mi", $data, $parsed)) {
   echo $parsed[1], " - ", $parsed[2];
} else {
   echo "no matches found at all";
}