PHP Regex Soru

5 Cevap php

5 Cevap

Ben böyle bir şey arıyoruz düşünüyorum:

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

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

preg_replace cevap benzer şekilde çalışır. Daha ayrıntılı bir şey yapmak istiyorsanız, geri bunu yapmak sağlayacak

Ben PHP DOM ayrıştırıcı kullanarak düşünün. Az bir şey kesmek. (Kesmek sadece basit bir regex ve DOM çözümleyici arasındaki farkı biliyor, her zaman kötü değil.) getElementsByTagName() sizin etiketleri alacak, getAttribute() href niteliklerini alacak ve setAttribute() değiştirir.

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

(not tested). The /e means you can use an expression in the replacement string

Sonuçta uzun vadede daha fazla sorun yaratabilir ki, bir çok adım görev conflating olabilir gibi görünüyor. Bu temelde üç şey yapmak istiyorum:

  1. Bir sayfadaki tüm çapa etiketleri bul
  2. Bu etiketleri href niteliğinde URL Özü
  3. Bu URL'den sorgu dizesinde belirli bir değişken Özü

PHP bunu yapmak için bir kaç yolu vardır. Evet, bir doğrudan bir yol normal bir ifade kullanıyor, ancak daha az şeffaf. Bu özel durumda, gerçekten çok küçük bir sorun uydurma veri konum, gelecekteki uygulamalar için kod ölçeklenebilirlik azaltır.

Benim önerim SimpleHTMLDom denilen Kaynak Forge mevcut bir ışık DOM çözümleyici uygulamasıdır. Bu ayrıştırıcı kullanarak, size taahhüt ediyoruz görev için çok daha net kod yazabilirsiniz.

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

Ve sonra tabii $ myVariable bu regex almak için aradığınız değer olacaktır.

Regexes (Can you provide some examples of why it is hard to parse XML and HTML with a regex? neden için bakınız) HTML ayrıştırma de temelde kötü. Ne gerek HTML ayrıştırıcı. Can you provide an example of parsing HTML with your favorite parser? ayrıştırıcıları kullanarak çeşitli örnekleri için bkz.