Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   [решено] PHP|регулярные выражения, preg_match (http://forum.oszone.net/showthread.php?t=162307)

morgan1991 04-01-2010 15:07 1310545

PHP|регулярные выражения, preg_match
 
Здравствуйте!
Никак не могу разобраться почему этот код работает неправильно:

PHP код:

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.\/]
Помогите пожалуйста, что не так?

Sham 04-01-2010 18:37 1310710

потому что экранировать спец-символы надо...
лучше так:
PHP код:

preg_match('{http\:\/\/[\S]*' preg_quote($name) . '}i'$TextBody$TempRegExp); 


Sham 04-01-2010 18:58 1310730

Цитата:

Цитата morgan1991
фильтрация работает только до знака "_", хотя он присутствует в рег. выражении:
Код:
[0-9_a-zA-Z.\/]
Помогите пожалуйста, что не так? »

Вспомнил (у меня был такой затык)... знак _ в символьном классе нельзя располагать между диапазонами, а лучше в самом конце класса
Код:

[0-9a-zA-Z\.\/\_]
. Это фигня недокументированная (не видел такого), поэтому пришел к этому опытным путем...

morgan1991 04-01-2010 19:09 1310738

Цитата:

Цитата Sham
потому что экранировать спец-символы надо... »

хмм...
Значит не тут ошибка была, а здесь:
PHP код:

preg_match('/name="name" value="[0-9,a-z,A-Z,.]*/'$Text$TempRegExp);
$TempRegExp explode('name="name" value="'$TempRegExp[0]);
$name $TempRegExp[1]; 

Никак не разберусь в этих выражениях...
Пробовал так (по аналогии :) ) :

PHP код:

preg_match('{name="name" value="[\S]*}i'$Text$TempRegExp);
$TempRegExp explode('name="name" value="'$TempRegExp[0]);
$name $TempRegExp[1]; 

Так:
PHP код:

preg_match('/name="name" value="[\S]*/'$Text$TempRegExp);
$TempRegExp explode('name="name" value="'$TempRegExp[0]);
$name $TempRegExp[1]; 

И всё не работает...

Цитата:

Цитата Sham
а лучше в самом конце класса »

Ни так:
PHP код:

preg_match('/name="name" value="[0-9,a-z,A-Z,.,_]*/'$Text$TempRegExp);
$TempRegExp explode('name="name" value="'$TempRegExp[0]);
$name $TempRegExp[1]; 

Ни так:
PHP код:

preg_match('/name="name" value="[0-9a-zA-Z._]*/'$Text$TempRegExp);
$TempRegExp explode('name="name" value="'$TempRegExp[0]);
$name $TempRegExp[1]; 

Не пашет...
А с этим всё норм, спс...
Цитата:

Цитата Sham
лучше так:
PHP код:
preg_match('{http\:\/\/[\S]*' . preg_quote($name) . '}i', $TextBody, $TempRegExp); »


Sham 04-01-2010 20:24 1310793

Цитата:

Цитата morgan1991
value="[0-9,a-z,A-Z,.,_] »

запятые то зачем? если не входят в класс, то не нужны, тем более несколько...
Цитата:

Цитата morgan1991
/name="name" value="[0-9a-zA-Z._]*/ »

если ссылка в value и нужно ее вытащить, то здесь нужна подмаска ()

PHP код:

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 1310824

Цитата:

Цитата Sham
если ссылка в value и нужно ее вытащить, то здесь нужна подмаска () »

Не совсем так, с $name была ошибка, теперь в неё приходят нормальные данные.
Суть скрипта в следующем, он выковыривает имя в переменную $name затем получает другой текст и с помощью полученной $name получаем ссылку. Но теперь вот это не работает:
PHP код:

preg_match('{http\:\/\/[\S]*' preg_quote($name) . '}i'$TextBody$TempRegExp);
$OpenFile $TempRegExp[0]; 

В $name приходит test_test.rar, затем скрипт должен выковырять ссылку в конце которой стоит test_test.rar, но он выковыривает только если $name к примеру = testtest.rar

Sham 05-01-2010 03:10 1311102

на самом деле, если вытаскиваем из конкретного уникального тега, то $name вообще необязателен.
PHP код:

if
(
    
$name &&
    
preg_match
    
(
        
'{name\=\"name\"\s+value\=\"(http\:\/\/[^\s\"]+)\"}i',
        
$TextBody,
        
$TempRegExp
    
)
)

echo 
$TempRegExp[1]; 

если речь идет о летитбит.нет, то там value без http (только имя файла)... т.е. в регулярном выражении "http://" не нужно.
HTML код:

<input type="hidden" name="name" value="Flash_Slideshow_Maker_Professional_4.90___Rus.rar" />

morgan1991 05-01-2010 13:26 1311294

Цитата:

Цитата Sham
то $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 присутствует _. Как можно всёже выковырять ссылку

Sham 05-01-2010 14:52 1311393

выполните этот код
PHP код:

$name 'Mozila_Firefox.rar';

$TextBody 'sdfsdf sdf <a rel="nofollow" href="/go.php?url=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 1311475

Sham, спасибо огромнейшее, всё заработало.
Моя дырявая голова забыла про ещё один элемент, который равен томуже названию файла
PHP код:

preg_match('/name="realname" value="[0-9a-zA-Z._]*/'$Text$TempRegExp); 


morgan1991 09-03-2010 21:09 1364703

Здравствуйте!
Возник ещё один вопросик.
Никак не могу сделать так чтоб удалялись все html теги <br>, НО заключённые между <code> и </code> остальные ненужно трогать...
Сделал так:
PHP код:

$txt preg_replace"#\<code\>(.*)\<br\>(.*)\<\/code\>#is""<code>$1$2</code>"$txt); 

0 эмоций....
Помогите плиз...

Sham 10-03-2010 01:03 1364926

как вариант, содержимое тега кодировать base64, установив метки вокруг, потом вырезать br, и после этого декодировать по меткам. (preg_replace c флагом e у регулярного выражения).


Время: 22:46.

Время: 22:46.
© OSzone.net 2001-