PHP Complicated preg_match

#php #preg-replace #preg-match

#php #preg-replace #preg-совпадение

Вопрос:

Это далеко, но я экспериментировал как с preg_match, так и с preg_replace, пытаясь сделать что-то чрезвычайно сложное.

Я пытаюсь взять ВЕСЬ код кнопки PayPal и извлечь только 13-значный идентификационный номер кнопки. Я успешно использовал preg_replace, чтобы удалить все ненужные символы и представить код в виде одной строки беспорядочного беспорядка. К сожалению, я также извлек знаки равенства, которые, как я предполагаю, мне понадобятся для извлечения значения = из этой недавно сгенерированной строки.

Вторая проблема, с которой я сталкиваюсь, заключается в том, что даже если я могу оставить знаки равенства в созданной мной строке, в форме кнопки paypal есть два значения. Теперь мне как-то нужно игнорировать первое значение и использовать только второе, которое является нужным мне идентификатором.

Единственная причина, по которой я это делаю, заключается в том, что у PayPal, похоже, нет способа скопировать только этот идентификатор кнопки. Вместо этого он генерирует код для всей формы, и когда вы нажимаете на него, он автоматически выделяет весь код формы, не позволяя вам просто выделить небольшую часть, которую вы хотите. Я должен сделать это, чтобы кому-то, кто не понимает код, было проще скопировать код формы, вставить его в поле формы и заставить веб-сайт автоматически захватить этот идентификационный номер, а затем использовать его в другом написанном мной скрипте.

Пока у меня есть это:

 <?php
$string = '';
$res = preg_replace("/[^a-zA-Z0-9]/", "", $string);
echo $res;
?>
 

Когда я добавляю код формы PayPal в строку вверху, которая выглядит следующим образом:

 <form target="paypal" action="https://www.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="hosted_button_id" value="D3DPV3Y2WSA4J">
<input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_cart_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
<img alt="" border="0" src="https://www.paypalobjects.com/en_US/i/scr/pixel.gif" width="1" height="1">
</form>
 

Я получаю это:
formtargetpaypalactionhttpswwwpaypalcomcgibinwebscrmethodpostinputtypehiddennamecmdvaluesxclickinputtypehiddennamehostedbuttonidvalueD3DPV3Y2WSA4JinputtypeimagesrchttpswwwpaypalobjectscomenUSibtnbtncartLGgifborder0namesubmitaltPayPalThesafereasierwaytopayonlineimgaltborder0srchttpswwwpaypalobjectscomenUSiscrpixelgifwidth1height1form

И, конечно, единственное, что мне нужно от этого, это второе значение: D3DPV3Y2WSA4J

Я чувствую, что мог бы провести еще немного исследований и выяснить, как оставить знаки равенства, чтобы все значения выглядели так: value= но я действительно не уверен, что смогу пропустить первое значение и захватить только второе.

Для меня это отличный опыт обучения, поскольку я не часто использую подобный код, но хотел бы получить больше знаний. Всем, кто это читает, большое спасибо за ваше время!

Ответ №1:

Вероятно, лучшим решением будет использовать библиотеку DOM-анализатора, такую как Simple DOM Parser. Но вы можете сделать:

 preg_match('/name="hosted_button_id"s*value="(w )"/', $string, $match);
$button_id = $match[1];
 

Комментарии:

1. В этом случае я использую $button_id для echo?

2. Вы можете делать с ним все, что захотите $button_id . Если вы хотите повторить это, сделайте это.

Ответ №2:

Хороший ответ от Barmar. Другое решение, использующее preg_replace() что-то вроде:

 $res = preg_replace('~(. )(name="hosted_button_id"s value=")([^"] )(["]. )~s', '$3', $string);
echo $res;
 

Комментарии:

1. Это абсолютно блестяще! Вы оба гении!