Показать полную графическую версию : [решено] PHP|регулярные выражения, preg_match
morgan1991
04-01-2010, 15:07
Здравствуйте!
Никак не могу разобраться почему этот код работает неправильно:
preg_match('/http:\/\/[0-9_a-zA-Z.\/]*'.$name.'/', $TextBody, $TempRegExp);
Он должен возвращать в $TempRegExp[0] ссылку. Всё вроди норм, но ссылки такого типа:
http://hghgf.ru/yukuioui/4543.ac4608a62f7e51286fad6f253/Mozila_Firefox.rar.html
Он выводит так:
http://letitbit.net/download/4543.ac4608a62f7e51286fad6f253/Mozila
Т.е. фильтрация работает только до знака "_", хотя он присутствует в рег. выражении: [0-9_a-zA-Z.\/]
Помогите пожалуйста, что не так?
потому что экранировать спец-символы надо...
лучше так:
preg_match('{http\:\/\/[\S]*' . preg_quote($name) . '}i', $TextBody, $TempRegExp);
фильтрация работает только до знака "_", хотя он присутствует в рег. выражении:
Код:
[0-9_a-zA-Z.\/]
Помогите пожалуйста, что не так? »
Вспомнил (у меня был такой затык)... знак _ в символьном классе нельзя располагать между диапазонами, а лучше в самом конце класса [0-9a-zA-Z\.\/\_]. Это фигня недокументированная (не видел такого), поэтому пришел к этому опытным путем...
morgan1991
04-01-2010, 19:09
потому что экранировать спец-символы надо... »
хмм...
Значит не тут ошибка была, а здесь:
preg_match('/name="name" value="[0-9,a-z,A-Z,.]*/', $Text, $TempRegExp);
$TempRegExp = explode('name="name" value="', $TempRegExp[0]);
$name = $TempRegExp[1];
Никак не разберусь в этих выражениях...
Пробовал так (по аналогии :) ) :
preg_match('{name="name" value="[\S]*}i', $Text, $TempRegExp);
$TempRegExp = explode('name="name" value="', $TempRegExp[0]);
$name = $TempRegExp[1];
Так:
preg_match('/name="name" value="[\S]*/', $Text, $TempRegExp);
$TempRegExp = explode('name="name" value="', $TempRegExp[0]);
$name = $TempRegExp[1];
И всё не работает...
а лучше в самом конце класса »
Ни так:
preg_match('/name="name" value="[0-9,a-z,A-Z,.,_]*/', $Text, $TempRegExp);
$TempRegExp = explode('name="name" value="', $TempRegExp[0]);
$name = $TempRegExp[1];
Ни так:
preg_match('/name="name" value="[0-9a-zA-Z._]*/', $Text, $TempRegExp);
$TempRegExp = explode('name="name" value="', $TempRegExp[0]);
$name = $TempRegExp[1];
Не пашет...
А с этим всё норм, спс...
лучше так:
PHP код:
preg_match('{http\:\/\/[\S]*' . preg_quote($name) . '}i', $TextBody, $TempRegExp); »
value="[0-9,a-z,A-Z,.,_] »
запятые то зачем? если не входят в класс, то не нужны, тем более несколько.../name="name" value="[0-9a-zA-Z._]*/ »
если ссылка в value и нужно ее вытащить, то здесь нужна подмаска ()
if
(
$name &&
preg_match
(
'{name\=\"name\"\s+value\=\"(http\:\/\/[^\s\"]*' . preg_quote($name) . ')\"}i',
$TextBody,
$TempRegExp
)
)
echo $TempRegExp[1]; // ссылка тут
morgan1991
04-01-2010, 20:57
если ссылка в value и нужно ее вытащить, то здесь нужна подмаска () »
Не совсем так, с $name была ошибка, теперь в неё приходят нормальные данные.
Суть скрипта в следующем, он выковыривает имя в переменную $name затем получает другой текст и с помощью полученной $name получаем ссылку. Но теперь вот это не работает:
preg_match('{http\:\/\/[\S]*' . preg_quote($name) . '}i', $TextBody, $TempRegExp);
$OpenFile = $TempRegExp[0];
В $name приходит test_test.rar, затем скрипт должен выковырять ссылку в конце которой стоит test_test.rar, но он выковыривает только если $name к примеру = testtest.rar
на самом деле, если вытаскиваем из конкретного уникального тега, то $name вообще необязателен.
if
(
$name &&
preg_match
(
'{name\=\"name\"\s+value\=\"(http\:\/\/[^\s\"]+)\"}i',
$TextBody,
$TempRegExp
)
)
echo $TempRegExp[1];
если речь идет о летитбит.нет, то там value без http (только имя файла)... т.е. в регулярном выражении "http://" не нужно.
<input type="hidden" name="name" value="Flash_Slideshow_Maker_Professional_4.90___Rus.rar" />
morgan1991
05-01-2010, 13:26
то $name вообще необязателен. »
Неееее.
Мне нужен $name его потом нужно постом моного раз отправлять.
+ если не буду знать его то не смогу выдрать ссылку из текста, она не в теге, а просто <a href="Ссылка"></a>...
там ссылка такого типа:
http://94.198.240.101/downloadp3/8476.8f9d65b794659f30f685b0fa6_RSFpq0JD7LvY/1150798/letitbit.net/MozilaFirefox.rar
Если не буду знать имя файла, как её выковыряю?
А если $name = Mozila_Firefox.rar, тогда ссылка должна быть:
http://94.198.240.101/downloadp3/8476.8f9d65b794659f30f685b0fa6_RSFpq0JD7LvY/1150798/letitbit.net/Mozila_Firefox.rar
А он возвращает пустую строку, хотя $name действительно = Mozila_Firefox.rar.
это 100% из-за того, что в $name присутствует _. Как можно всёже выковырять ссылку
выполните этот код
$name = 'Mozila_Firefox.rar';
$TextBody = 'sdfsdf sdf <a href="http://94.198.240.101/downloadp3/8476.8f9d65b794659f30f685b0fa6_RSFpq0JD7LvY/1150798/letitbit.net/Mozila_Firefox.rar">sdfsdfsdf</a> sdfsdf sdfsdf sdfasdf';
if
(
preg_match
(
'{http\:\/\/[\S]*' . preg_quote($name) . '}i',
$TextBody,
$TempRegExp
)
)
echo $TempRegExp[0];
else
echo 'Не совпало';
работает железно... смотрите у себя.
morgan1991
05-01-2010, 16:05
Sham, спасибо огромнейшее, всё заработало.
Моя дырявая голова забыла про ещё один элемент, который равен томуже названию файла
preg_match('/name="realname" value="[0-9a-zA-Z._]*/', $Text, $TempRegExp);
morgan1991
09-03-2010, 21:09
Здравствуйте!
Возник ещё один вопросик.
Никак не могу сделать так чтоб удалялись все html теги <br>, НО заключённые между <code> и </code> остальные ненужно трогать...
Сделал так:
$txt = preg_replace( "#\<code\>(.*)\<br\>(.*)\<\/code\>#is", "<code>$1$2</code>", $txt);
0 эмоций....
Помогите плиз...
как вариант, содержимое тега кодировать base64, установив метки вокруг, потом вырезать br, и после этого декодировать по меткам. (preg_replace c флагом e у регулярного выражения).
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.