basit bir PHP preg_replace bir soru

3 Cevap php

Burada basit bir preg_replace bulunuyor

$string = 'src="index.php';
$string = preg_replace("/(src=('|\")+[^(http:|https:)])/i", "src=\"http://domain.com/", $string);
echo $string;

Ben sonuç src="http://domain.com/index.php olmasını bekliyoruz, ancak o çıkıyor src="http://domain.com/ndex.php.

Ben burada bir şey eksik olmalı ..

3 Cevap

Bu gerçekten berbat regex bulunuyor. Ne tam olarak ulaşmak için çalışıyoruz? URL alanı eklemek istediğiniz http veya https ile başlamıyorsa eğer benziyor? Eğer öyleyse, biraz kapalı konum:

$string = preg_replace('/src=(\'|")?(?!htts?:)/i', 'src="http://domain.com/');

işareti çok yakın olmalıdır.

Bu regex ne yapar? Bu arar:

  • src=
  • isteğe bağlı olarak, ya ' ya da ", ardından
  • not http: ya da https:, ardından
  • duyarsız tüm yapılır vaka

Note: {?!...), bir negative lookahead denilen ve bir zero-width assertion bir örneğidir. "Sıfır genişliği" burada herhangi bir girdi tüketmez anlamına gelir. Bu durumda, "izlemediği ..." anlamına gelir.

Lütfen regex ne yapar? Bu arar:

  • src=
  • bir or more ' ya da " karakter
  • isn't herhangi bir (http:|https:) herhangi bir karakter (ki ne [^...] araçları inşa)
  • duyarsız tüm vaka

Note:

[^(http:|https:)]

eşdeğerdir:

[^():https]

bu karakterleri not biridir herhangi bir karakter anlamına gelir.

Yapı [^(http:|https:)] yanlıştır. Durumu dışında herhangi bir karakterle (, h, t, p, :, {[(6) ]}, s ya da ).

$string = 'src="index.php'; $string = preg_replace("/src=('|\")?(?!htts?:)/i", "src=\"http://domain.com/", $string); echo $string;

Bu deneyin: ben kendim test