PDA

Показать полную графическую версию : PHP - регулярные выражения: HELP


GoldenOrb
07-08-2004, 21:45
никак не могу разобраться с регулярными выражениями, помогите
нужно выцепить имя картинки в строке(ах):
<img src="somefile.gif" alt="">
<img src=somefile.gif alt="">
<img src = somefile.gif>
с помощью функции preg_match_all

ivank
08-08-2004, 17:41
<?php

$test = <<<TEST
some text <imG src=image.gif> another text
text continues <iMg src= "image.png"  Alt=text>
txt <  img    src ='image.jpg'  alt ="text  sfds" sOme="other tags">
text again <img src=iMAGE.tiff alt=""> that's all, folks!
TEST;

// регэксп длинный, я его немножко разбил
$src_part = 'src\s*=\s*("[^"]*"|\'[^\']*\'|[^\s]+)';
$alt_part = '(\s+alt\s*=\s*("[^"]*"|\'[^\']*\'|[^\s]+))?';
preg_match_all('/<\s*img\s+'.$src_part.$alt_part.'(.*?)>/i', $test, $result);

echo '<pre>';
print_r($result);
echo '</pre>';

?>
Результат:Array
(
   [0] => Array
       (
           [0] => <imG src=image.gif>
           [1] => <iMg src= "image.png"  Alt=text>
           [2] => <  img    src ='image.jpg'  alt ="text  sfds" sOme="other tags">
           [3] => <img src=iMAGE.tiff alt="">
       )

   [1] => Array
       (
           [0] => image.gif
           [1] => "image.png"
           [2] => 'image.jpg'
           [3] => iMAGE.tiff
       )

   [2] => Array
       (
           [0] =>
           [1] =>   Alt=text
           [2] =>   alt ="text  sfds"
           [3] =>  alt=""
       )

   [3] => Array
       (
           [0] =>
           [1] => text
           [2] => "text  sfds"
           [3] => ""
       )

   [4] => Array
       (
           [0] =>
           [1] =>
           [2] =>  sOme="other tags"
           [3] =>
       )

)
Где здесь то, что тебе нужно и как убрать лишние кавычки, я думаю, понятно.

Важное замечание: после img обязательно должно быть src, а не какой-либо другой тэг. И alt, если он есть, дожен быть обязательно после src, иначе он не выцепится. Я когда-то давно делал на php парсер html (свой двигатель шаблонов делал), у него этих проблем не было бы, но он давно утерян :(

Guest
09-08-2004, 01:47
Если нужны только имена картинок, то я бы так написал:
preg_match_all("/[a-zA-Z0-9_-]{1,50}\.(png|gif|jpg)/",$string,$result);
В этом случае все имена картинок будут лежать в массиве $result[0]

vadimiron
09-08-2004, 01:49
:) Это был я, куда то кука моя делась-иеня не признали:(

mra214
08-07-2008, 10:13
Кто-нибудь может подсказать в чем проблема?
Значит так, возникла необходимость проверить все письма пришедшие на Return-path:<email>, с темой undelivered, ну или в роде этой и выдернуть оттуда email адреса.
Использовал следующий код: preg_match_all( '/[0-9a-z\._-]{3,15}@[0-9a-z\.-]{3,32}\.[a-z]{2,4}/i', $mail, $emails )
Регулярное выражение, конечно, не идеальное, но должно было бы выдернуть все email адреса.
Но работает, как-то, не стабильно - до того как среди писем были те, которые содержали точку в адресе (.), скрипт выдергивал email-ы вида - name_lastname@anything.com, blah_balh@foo.net.., т.е. те которые содержали символ подчеркивания. Не пойму в чем дело. Пытался использовать другие регулярные выражения, но безрезультатно.
Может проблема заключается в чем-то другом?

mra214
08-07-2008, 10:47
И еще, проверил, что если указать номер письма (где содержатся email-ы, которые обычно не обнаруживаются reg-ex-ом) явно, то reg-ex их обнаруживает.
Вот часть кода:

foreach ($mails as $mail_arr){
$mail = $pop3->pop3_retr($mail_arr[0]);
preg_match_all('/[0-9a-z\._-]{3,32}@[0-9a-z\.-]+\.[a-z]{2,4}/i', $mail, $emails);

}

метод pop3_retr() возвращает все письмо в виде простого текста.

mra214
08-07-2008, 13:35
Сорри, нашел проблему.
Регулярка тут не причем, просто, надо было вынести preg_match_all() из цикла и проверить весь текст писем
или же объединять массив $emails с другим массивом... ну или еще как-нибудь

gasha
15-07-2008, 18:24
Вот строка [1][0], 0.15, 0.18, 0.16

Нужно из неё выцепить 0.15 0.18 и 0.16

Числа могут меняться, но, в любом случае, они будут дробными.

Помогите, пожалуйста.

gasha
15-07-2008, 18:51
Решил самостоятельно...

$reg = "/[\d]{1,2}\.[\d]{1,2}/s";
preg_match_all ($pattern, $text, $res);

Coutty
15-07-2008, 18:59
gasha, а нельзя строку просто обработать explode'ом?
Скажем, $data = explode(',', $string); а потом просто проверять каждый элемент, конвертируется во float или нет: is_float(trim($data[$i]);

gasha
15-07-2008, 22:33
Возьму на заметку, спасибо.

gasha
18-07-2008, 12:36
Coutty, твой вариант справляется лучше: мой не видит отрицательные значения. Но у тебя ещё прихватываются числа в скобках.

[18][0], 7.8
[19][0], 5.1
[20][0], -0.4
[21][0], -4.1
[22][0], -3.5
[23][0], -0.2
[24][0], 1.6

Это структура оригинала из которго нужно выцепить числа, здесь один столбик, но их может быть несколько.

Coutty
18-07-2008, 14:04
gasha, так я ж для примера...
Можно в проверке писать if (substr($data[$i], 0, 1) != "[" && is_float(trim($data[$i])) { ... }
Т.е. если первый символ - не квадратная скобка и число конвертируется во float - значит пойдёт.

gasha
18-07-2008, 16:05
Совсем туплю...

<?php
$string ="[1][0], , , -0.15 , 0.18 , 0.16 ";
$data = explode(',', $string);
foreach ($data as $v)
{
if (is_float(trim($v))) {echo $v."<br>";}
else {echo "Увы!<br>";}
}
?>

Выводятся одни "Увы!"

Чего не так?

УРА!

Вот так заработало...

<?php
$string ="[1][0], , , -0.15 , 0.18 , 0.16 ";
$data = explode(',', trim($string));
foreach ($data as $v)
{
if (is_float($v+0)) {echo $v."<br>";}
else {echo "Увы!<br>";}
}
?>




© OSzone.net 2001-2012