我有这个字符串:
<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)
答案 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">|