Saya mencoba untuk mengganti string dan menghapus darinya semua URL yang tidak mengandung domain saat ini.

Sejauh ini saya mendapatkan regex ini, tetapi tidak mengecualikan mydomain. Apa yang saya lakukan salah?
http[s]?:\/\/[w]{0,3}\.{0,1}((?<!mydomain)[^\.].*)

Masukan dan keluaran yang diharapkan:
http://regex101. => harus cocok
http://www.regex101. => harus cocok
https://regex101. => harus cocok
https://www.regex101. => harus cocok
https://www.mydomain. => seharusnya tidak cocok, tetapi cocok

https://regex101.com/r/kGil9O/1

Saya telah membaca beberapa SO pertanyaan/jawaban dan entah itu tidak berfungsi untuk kasus saya, entah bagaimana berbeda. Saat menjawab, tolong jelaskan di mana saya salah sehingga saya bisa lebih baik lain kali. Terima kasih!

2
besciualex 12 Mei 2021, 23:41

2 jawaban

Jawaban Terbaik

Anda menggunakan tampilan belakang dengan cara yang salah, ia memeriksa teks di sebelah kiri, dan Anda mencoba mencocokkan www. sebelum tampilan belakang. www. bukan mydomain.

Gunakan pandangan ke depan:

https?:\/\/(?!(?:www\.)?mydomain)(?:www\.)?([^.].*)

Lihat bukti

Penjelasan

--------------------------------------------------------------------------------
  http                     'http'
--------------------------------------------------------------------------------
  s?                       's' (optional (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  :                        ':'
--------------------------------------------------------------------------------
  \/                       '/'
--------------------------------------------------------------------------------
  \/                       '/'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    (?:                      group, but do not capture (optional
                             (matching the most amount possible)):
--------------------------------------------------------------------------------
      www                      'www'
--------------------------------------------------------------------------------
      \.                       '.'
--------------------------------------------------------------------------------
    )?                       end of grouping
--------------------------------------------------------------------------------
    mydomain                 'mydomain'
--------------------------------------------------------------------------------
  )                        end of look-ahead
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    www                      'www'
--------------------------------------------------------------------------------
    \.                       '.'
--------------------------------------------------------------------------------
  )?                       end of grouping
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [^.]                     any character except: '.'
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
  )                        end of \1
1
Ryszard Czech 12 Mei 2021, 20:45

Anda mendapatkan semua kecocokan dengan pola yang Anda coba, karena tampilan negatif di belakang menegaskan jika mydomain tidak langsung ke kiri setelah pencocokan misalnya https:// atau https://www yang selalu benar.

Anda dapat secara opsional mencocokkan www\. menggunakan kuantifier posesif diikuti dengan tampilan negatif:

^https?://(?:www\.)?+(?!mydomain\.)\S+$

Polanya cocok:

  • ^ Awal dari string
  • https?:// Cocokkan protokol dengan s opsional dan ://
  • (?:www\.)?+ Secara opsional cocokkan www. dan gunakan kuantifier posesif untuk tidak mundur saat dicocokkan
  • (?!mydomain\.) Pandangan negatif ke depan, tegaskan bukan mydomain. langsung di sebelah kanan dari posisi saat ini
  • \S+ Cocokkan 1+ kali karakter non-spasi apa pun
  • $ Akhir string

demo regex | Demo PHP

Contoh

$strings = [
    "http://regex101.",
    "http://www.regex101.",
    "https://regex101.",
    "https://www.regex101.",
    "https://www.mydomain.",
    "https://mydomain."
];
$pattern = "~^https?://(?:www\.)?+(?!mydomain\.)\S+$~";
foreach ($strings as $s) {
    if (preg_match($pattern, $s)) {
        echo "Match: $s" . PHP_EOL;
    } else {
        echo "No match: $s" . PHP_EOL;
    }
}

Keluaran

Match: http://regex101.
Match: http://www.regex101.
Match: https://regex101.
Match: https://www.regex101.
No match: https://www.mydomain.
No match: https://mydomain.
2
The fourth bird 12 Mei 2021, 21:26