PHP Regex Вопрос - PullRequest
       33

PHP Regex Вопрос

1 голос
/ 22 мая 2009

У меня есть серия URL-адресов в веб-документе, что-то вроде этого:

<a href="somepage.php?x=some_document.htm">click here</a>

Что я хочу сделать, это заменить жирный кусок:

some_document.htm"> нажмите здесь

.. с каким-то зашифрованным вариантом (скажем, base64_encoding) .. примерно так:

для каждого совпадения, превратить его в base64_encode (совпадение)

Примечания:

1. фраза href = "somepage.php? X = всегда будет предшествовать фразе.
2. Двойная кавычка (" ) всегда будет следовать фраза.

Я не гуру регулярных выражений, но я знаю, что некоторые из вас. Есть ли простой способ сделать это?

UPDATE:

Я решил это, используя измененную версию того, что представил Крис, вот оно:

function encrypt_param( $in_matches ) {    
  return   'href="somepage.php?x=' . base64_encode( $in_matches[1] ) . '"';
}

$webdoc = preg_replace_callback( '/href="somepage.php\?x=([^"]+)"/',
                                 'encrypt_param', 
                                 $webdoc );

Ответы [ 5 ]

6 голосов
/ 22 мая 2009

Я думаю, вы ищете что-то вроде этого:

function doSomething($matches) {
   return base64_encode($matches[1]);
}

preg_replace_callback('/href="somepage.php?x=([^"]+)"/', 'doSomething', $webdoc);

Ответ preg_replace работает аналогично. Если вы хотите сделать что-то более сложное, обратный вызов позволит вам сделать это

2 голосов
/ 22 мая 2009

Я хотел бы рассмотреть использование парсера PHP DOM . Все, что меньше, - это хак. (Не то, чтобы хаки всегда были плохими, просто знайте разницу между простым регулярным выражением и анализатором DOM.) getElementsByTagName() получит ваши теги, getAttribute() получит ваши атрибуты href и setAttribute() изменится.

1 голос
/ 22 мая 2009

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

  1. Найти все теги привязки на странице
  2. Извлечение URL из атрибута href из этих тегов
  3. Извлечение определенной переменной в строке запроса из этого URL

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

Мое предложение заключается в реализации легкого парсера DOM, доступного от Source Forge, под названием SimpleHTMLDom . Используя этот синтаксический анализатор, вы можете написать гораздо более понятный код для выполняемой задачи.

foreach ($dom_object->find('a') as $anchor){
    $url = $anchor->href;
    $queryArray = array();
    parse_str(parse_url($url, PHP_URL_QUERY), $queryArray);
    $myVariable = $queryArr['x'];
}

И тогда, конечно, $ myVariable будет значением, которое вы хотите получить с помощью этого регулярного выражения.

1 голос
/ 22 мая 2009

preg_replace('/href="somepage.php\?x=([^"]*)"/e', "somepage.php?x='.base64_encode("$1").'"', $url)

(не проверено). / E означает, что вы можете использовать выражение в строке замены

0 голосов
/ 22 мая 2009

Регулярные выражения в принципе плохо разбирают HTML (см. . Можете ли вы привести некоторые примеры того, почему трудно анализировать XML и HTML с регулярным выражением? , почему). Что вам нужно, это HTML-парсер. См. Можете ли вы привести пример разбора HTML с вашим любимым парсером? для примеров использования различных парсеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...