У меня есть эта строка:
<form action="../?x=3O1*qY*E-dEItGGem1mH3VN5Nm6cO0hiQkOl0nSasIQqTDPzbSUbCI3UYWGGhwZ0" id="id8" method="post">
И я хотел бы получить только строку внутри атрибута действия следующим образом:
../?x=3O1*qY*E-dEItGGem1mH3VN5Nm6cO0hiQkOl0nSasIQqTDPzbSUbCI3UYWGGhwZ0
Я пробовал много регулярных выражений, но они не работали.
preg_match('|<form action="../?x=(.+?)" id="id8" method="post">|', $output, $matches)
Взгляните на этот пост: получите подстроку между двумя строками 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');
}
EDIT: Как предложил Микель Битсон, метод DomParser является более чистым и будет работать, если существует более одной формы.
Во-первых, если вы разбираете HTML, вы можете использовать встроенный парсер DOM, как было предложено Mikel Bitson.
Причина, по которой ваш |<form action="../?x=(.+?)" id="id8" method="post">|
регулярное выражение не работает, в первую очередь это первое ?
которые необходимо избегать. Yyou должен действительно избегать этих подстановочных матчей, если вы действительно хотите совместить два периода.
Это даст вам нечто вроде |<form action="\.\./\?x=(.+?)" id="id8" method="post">|
или, если вы просто хотите весь URL, |<form action="([^"]+)" id="id8" method="post">|
action="([^"]+)"
учитывая, что ОП хочет получить это значение.
Включает ли строка закрывающий тег и другие необходимые теги, чтобы сделать его правильным 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');
}