Помогите регуляркой...

Статус
В этой теме нельзя размещать новые ответы.

Zircool

Создатель
Регистрация
1 Июн 2008
Сообщения
35
Реакции
43
Функция скрипта это удаление из базы ссылок tags.php ссылки с нужным именем...

Основная задача это вытащить из ссылки её путь, что бы потом функцией unlink удалить этот файл
Ссылки такие:

<a href="golubi.php">Голуби</a>,
<a href="medved.php">Медведи</a>,

PHP:
$filename=trim($_POST['istagdel']);
$filetagsstring=file_get_contents('tags.php');
preg_match('/\<a href=\"(.*?)\"\>'.$filename.'\<\/a\>,/is', $filetagsstring,$res);
echo $res[1];

Но ничего не выводит. Проблема в регулярке?
 
используй preg_match_all, а то preg_match используется для проверки есть ли вхождения, и это будет либо 0 раз (нет совпадений), либо 1 раз, поскольку preg_match() остановит поиск после первого найденного
 
используй preg_match_all, а то preg_match используется для проверки есть ли вхождения, и это будет либо 0 раз (нет совпадений), либо 1 раз, поскольку preg_match() остановит поиск после первого найденного
Ага если ссылка с одним содержанием встречается много раз, но если она встречается только один раз скрипт должен правильно работать, скорее всего дело в несоответствии кодировок $_POST['istagdel'] и tags.php.
З.Ы. зачем столько экранированных символов, здесь можно обойтись вообще без них:
'{<a href="(.*?)">'.$filename.'</a>,}is'
 
PHP:
preg_match("/href=('|\")([^<>'\"]+)('|\")/is", $filetagsstring,$res);
print_r($res);

должно помочь
 
sasha181
Человеку, как я понимаю, нужно выбрать определенные ссылки по названию, и достастать их href, четко зная формат в котором они записанны. А для этого его регулярка подходит.
А чтобы просто найти произвольный href в тексте, правильней записать
Код:
href=(?:"[^"]*"|'[^']*'|[a-zA-Z0-9_:.-]+)
В отличии от вашего оно найдет также:
href="http://site.ru/index.php?s='mama'"
href=index.html
href=""
Но не найдет:
href='превед"
 
sasha181
Человеку, как я понимаю, нужно выбрать определенные ссылки по названию, и достастать их href, четко зная формат в котором они записанны. А для этого его регулярка подходит.
А чтобы просто найти произвольный href в тексте, правильней записать
Код:
href=(?:"[^"]*"|'[^']*'|[a-zA-Z0-9_:.-]+)
В отличии от вашего оно найдет также:
href="http://site.ru/index.php?s='mama'"
href=index.html
href=""
Но не найдет:
href='превед"

на самом деле я не очень силён в регулярках, потому вполне мог и упустить что-то.
Но всё же не во всём могу согласиться с Вами. Например, мне ещё ни разу не приходилось встречать ссылки типа
href="http://site.ru/index.php?s='mama'"
а вот такие приходилось
href="http://site.ru/index.php?s=мама"

а вот
href='превед"
это действительно проблема
подумаю над тем как исправить

Я вот только не совсем понял Вашу регулярку.
По какому принципу он находит знаки / и ?
если Вас не затруднить, объясните пожалуйста
также там похоже упущен знак +
он далеко не редкость в GET запросах
 
на самом деле я не очень силён в регулярках, потому вполне мог и упустить что-то.
Но всё же не во всём могу согласиться с Вами. Например, мне ещё ни разу не приходилось встречать ссылки типа
href="http://site.ru/index.php?s='mama'"
а вот такие приходилось
href="http://site.ru/index.php?s=мама"
Главное, что стандарт позволяет использовать одинарные кавычки внутри двойных и наоборот. Такие ссылки может видеть и неприходилось, но вот по типу:
href="javascript:alert('привет');"
и сам писал не раз.

Я вот только не совсем понял Вашу регулярку.
По какому принципу он находит знаки / и ?
если Вас не затруднить, объясните пожалуйста
также там похоже упущен знак +
он далеко не редкость в GET запросах
sasha181
Находит по принципу [^"]- любой сивол кроме кавычки *-произвольное число раз. Вобще там три альтернативы(разделенные знаком |)
первая находит значения вида:
href="бла-бла-бла"
вторая:
href='бла-бла-бла'
третья:
href=бла-бла-бла (туту согласно документации бла-бла-бла может быть только символами [a-zA-Z0-9_:.-])

Таже регулярка в режиме free-spacing, с комментариями
Код:
href=(?:
    "
       [^"]* #любой символ кроме кавычки произвольное число раз
    "
 |
    '
       [^']* #любой символ кроме одинарной кавычки произвольное число раз
    '
 |
    [a-zA-Z0-9_:.-]+ #символ из перечисленных хотябы один раз, либо больше
)
 
Ок спасибо все большое за помощь. Но опять столкнулся с проблемой, вроде бы правильно регулярку пишу.... ообщем есть файл results.php Который имеет вид

PHP:
<table>
<tr><td>IE</td><td>0<td></tr>
<tr><td>Mozilla</td><td>0<td></tr>
<tr><td>Netscape</td><td>0<td></tr>
<tr><td>Opera</td><td>0<td></tr>
</table>

Из него надо вытянуть цифровые значения... Вообще это скрипт голосоваяния, цифры это и есть количество голосов. Пишу так
PHP:
<html>
<head>
<title>Голосование</title>
</head>
<form  method="post">
<h1>Ваш браузер? </h1>
<input type="radio" name="vote" value="IE">IE<br>
<input type="radio" name="vote" value="Mozilla">Mozilla<br>
<input type="radio" name="vote" value="Netscape">Netscape<br>
<input type="radio" name="vote" value="Opera">Opera<br>
<input type="submit" name="sub" value="Голосовать"><br>
</form>
<body>
</body>
</html>

<?php
if(isset($_POST['sub']))
{
$results=file_get_contents('results.php');
$data=trim($_POST['vote']);
preg_match('#<tr><td>'.$data.'</td><td>(.*?)</td></tr>#',$results,$res);
echo $res[1];
}



?>
 
Наверно поэтому:)
<tr><td>Opera</td><td>0<td></tr>
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху