Автоматическая генерация регулярного выражения для поиска ссылок
- 21 ноября, 2011
- Posted in работа
- Write comment
Решил перетащить записи из старого блога.
Вопрос: как на примере нескольких ссылок автоматически написать регулярное выражение, находящее все подобные ссылки на любой предложенной странице?
Ответ: очень просто.
Для наглядности возьмём ссылки на профайлы в livejournal.com
http://d-e-m-k-a.livejournal.com/profile http://4nt0nkn.livejournal.com/profile http://fluteast.livejournal.com/profile http://v-poroshok.livejournal.com/profile
Думаю хватит.
Первое что мы делаем – это разбиваем все строки по символам, разделяющим любой URL на части – это точка, слэш, знак вопроса (в данном примере отсутствует) и амперсент.
foreach ($data as $k=>$v)
{
$arr[$k] = preg_split('$[\/\.\?\&\=]$i',$v);
}
Далее переформируем данный массив, так чтоб можно было посмотреть схожесть частей.
$arr1 = array();
foreach ($arr as $k=>$v)
{
foreach ($v as $k1=>$v1)
{
$arr1[$k1][] = $v1;
}
}
Теперь смотрим одинаковые ли получились куски во всех ссылках, если да, то в регулярку вставляем именно этот кусок, если нет, то кусок должен быть любым набором символов, кроме тех, которыми мы разбивали URLы
$res = "";
foreach ($arr1 as $k=>$v)
{
$v = array_unique($v);
if (isset($arr1[$k+1]))
{
if (count($v) == 1)
{
$res .= $v[0]."[\/\.\?\&\=]";
}else
{
$res .= "[^\/\.\?\&\=]+[\/\.\?\&\=]";
}
}else
{
if (count($v) == 1)
{
$res .= $v[0]."";
}else
{
$res .= "[^\/\.\?\&\=\"\'\s]+";
}
}
}
На выходе имеем регулярное выражение:
http:[\/\.\?\&\=][\/\.\?\&\=][^\/\.\?\&\=]+[\/\.\?\&\=]livejournal[\/\.\?\&\=]com[\/\.\?\&\=]profile
Если где-то нужно пояснения в коде, пишите в каментах. Я обязательно отвечу.
Интересный способ. Спасибо.
Как раз было нужно что-то подобное.