Hatalı Düzenli İfade ile Maçları

2 Cevap php
$regexp = '/(?:<input\stype="hidden"\sname="){1}([a-zA-Z0-9]*)(?:"\svalue="1"\s\/>)/';
$response = '<input type="hidden" name="7d37dddd0eb2c85b8d394ef36b35f54f" value="1" />';
preg_match($regexp, $response, $matches);

echo $matches[1]; // Outputs: 7d37dddd0eb2c85b8d394ef36b35f54f

Yani bir komut dosyası giriş preform için Joomla uygulama bir web sayfasında bir kimlik doğrulama belirteci aramak için bu normal bir ifade kullanıyorum.

Tüm bu çalışma var ama her zaman 2 öğeleri döndürür olarak benim düzenli ifade ile neyin yanlış olduğunu merak ediyorum.

Array ( [0] => [1] => 7d37dddd0eb2c85b8d394ef36b35f54f)

Ayrıca ben değişiklikleri uzunluğunda ve adına hem de her sayfanın yükünü kontrol ediyorum girdi ismi.

2 Cevap

Sorun yok. Ürün [0] her zaman tüm maç içerir. the docs (vurgu benim) Gönderen:

If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.

Sizin regex (size gerektiğini biliyorum ilk etapta regexes ile HTML üzerinde çalışıyoruz gerçeğini bakan) biraz çok karmaşıktır.

$regexp = '#<input\s+type="hidden"\s+name="([0-9a-f]*)"\s+value="1"\s*/>#i'
  • Sen hiç olmayan yakalama gruplarını gerekmez.
  • Tek bir karaktere sizi sınırlayan, \s kullanın. \s+ muhtemelen daha iyidir.
  • Regex sınır olarak / daha farklı bir şey kullanarak ileri kaçan yapar gereksiz regex bölü.
  • Regex harf duyarsız, çok yararlı olabilir yapma.
  • Auth token onaltılık dize gibi görünüyor, böylece eşleşen a-z gereksizdir.

Için manuel giriş başına preg_match:

Karşılaşmalar sağlanır, o zaman arama sonuçları ile doldurulur. $ Karşılaşmalar [0] full desen, $ maçı [1] böylece ilk yakalanan parantez dizilimi eşleşen metin var ve olacak eşleşen metni içerecektir.