Получить все между - PHP

1

У меня есть эта строка:

<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) 
  • 1
    покажи нам, что ты попробовал, и мы сможем рассказать, почему они не сработали.
  • 1
    preg_match ('| <form action = "../? x = (. +?)" id = "id8" method = "post"> |', $ output, $ match)
Показать ещё 4 комментария
Теги:

3 ответа

1
Лучший ответ

Взгляните на этот пост: получите подстроку между двумя строками 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 является более чистым и будет работать, если существует более одной формы.

  • 0
    Этот ответ является твердым, если найти строку между двумя символами. При этом, что произойдет, если в HTML более одного элемента формы? Внедрение этого в DOMDocument позволит вам работать с ним как с элементами HTML. РЕДАКТИРОВАТЬ: Теперь я вижу, что вы добавили опцию DOM.
  • 0
    Отредактировано! Спасибо за ваше предложение!
1

Во-первых, если вы разбираете 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">|

  • 1
    или, что еще лучше, action="([^"]+)" учитывая, что ОП хочет получить это значение.
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');
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню