Если вы хотите «исключить те URL-адреса, которые не содержат определенного слова в них», вы можете использовать положительный взгляд на слово (с некоторым количеством символов перед ним), например.
(?=.*Sing)
В Javascript:
const word = 'Sing';
const urls = ['http://I_like_to_sing.mp3', 'http://Another_song.mp3'];
let regex = new RegExp('https?:\/\/(?=.*' + word + ').+\.mp3', 'i');
console.log(urls.filter(v => v.match(regex)));
В PHP
$word = 'Sing';
$urls = ['http://I_like_to_sing.mp3', 'http://Another_song.mp3'];
$regex = "/https?:\/\/(?=.*$word).+\.mp3/i";
print_r(array_filter($urls, function ($v) use ($regex) { return preg_match($regex, $v); }));
Выход:
Array (
[0] => http://I_like_to_sing.mp3
)
Демонстрация на 3v4l.org
Update
Чтобы исключить те URL-адреса, в которых do содержит определенное слово, вместо этого можно использовать отрицательный взгляд, например,
(?![^.]*Sing)
Мы используем [^.]
, чтобы гарантировать, что слово встречается перед частью .mp3
. Вот демоверсия PHP:
$word = 'Song';
$string = "some words http://I_like_to_sing.mp3 and then some other words http://Another_song.mp3 and some words at the end...";
$regex = "/(https?:\/\/(?![^.]*$word).+?\.mp3)/i";
preg_match_all($regex, $string, $matches);
print_r($matches[1]);
Выход:
Array (
[0] => http://I_like_to_sing.mp3
)
Демонстрация на 3v4l.org