获取一切 - PHP

时间:2015-11-03 17:50:02

标签: php regex

我有这个字符串:

<form action="../?x=3O1*qY*E-dEItGGem1mH3VN5Nm6cO0hiQkOl0nSasIQqTDPzbSUbCI3UYWGGhwZ0" id="id8" method="post">

我想获取action属性中的字符串,如下所示:

../?x=3O1*qY*E-dEItGGem1mH3VN5Nm6cO0hiQkOl0nSasIQqTDPzbSUbCI3UYWGGhwZ0

我尝试了许多正则表达式,但它们没有用。

preg_match('|<form action="../?x=(.+?)" id="id8" method="post">|', $output, $matches) 

3 个答案:

答案 0 :(得分:1)

字符串是否包含结束标记和其他必要的标记以使其成为正确的HTML?如果是这样,请尝试将其加载到DOMElement并从那里对其进行操作,如下所示:

$dom = new DomDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadHTML($html);
$forms = $dom->getElementsByTagName('form'); // Find Forms
foreach ($forms as $form){
    echo $form->getAttribute('action');
}

答案 1 :(得分:1)

看一下这篇文章:Get substring between two strings PHP

对于您的特殊情况,我建议您按照以下步骤操作:

function get_string_between($string, $start, $end){
    $string = ' ' . $string;
    $ini = strpos($string, $start);
    if ($ini == 0) return '';
    $ini += strlen($start);
    $len = strpos($string, $end, $ini) - $ini;
    return substr($string, $ini, $len);
}

$fullstring = '<form action="../?x=3O1*qY*E-dEItGGem1mH3VN5Nm6cO0hiQkOl0nSasIQqTDPzbSUbCI3UYWGGhwZ0" id="id8" method="post">';
$parsed = get_string_between($fullstring, 'action="', '"');

echo $parsed; // result

您也可以使用DOMParser:

$html = '<form action="../?x=3O1*qY*E-dEItGGem1mH3VN5Nm6cO0hiQkOl0nSasIQqTDPzbSUbCI3UYWGGhwZ0" id="id8" method="post">';
$d = new DomDocument();
$d>loadHTML($html);
$forms = $d->getElementsByTagName('form');
foreach ($forms as $key => $f){
    echo $f->getAttribute('action');
}

编辑:正如Mikel Bitson所建议的那样,DomParser方法更清晰,如果有多个表单,它将起作用。

答案 2 :(得分:1)

首先,如果您正在解析HTML,则可以使用Mikel Bitson's answer建议的内置DOM解析器。

|<form action="../?x=(.+?)" id="id8" method="post">|正则表达式不起作用的原因主要是需要转义的第一个?。如果你真的想要匹配两个时期,你应该真的逃脱那些通配符。

这会给你类似|<form action="\.\./\?x=(.+?)" id="id8" method="post">|

的东西

或者,如果您只想要整个网址|<form action="([^"]+)" id="id8" method="post">|