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

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

GoldenOrb 07-08-2004 21:45 212977

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

ivank 08-08-2004 17:41 212978

Код:

<?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 212979

Если нужны только имена картинок, то я бы так написал:
Код:

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

vadimiron 09-08-2004 01:49 212980

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

mra214 08-07-2008 10:13 845549

Кто-нибудь может подсказать в чем проблема?
Значит так, возникла необходимость проверить все письма пришедшие на 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 845573

И еще, проверил, что если указать номер письма (где содержатся 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 845721

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

gasha 15-07-2008 18:24 852272

Вот строка [1][0], 0.15, 0.18, 0.16

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

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

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

gasha 15-07-2008 18:51 852293

Решил самостоятельно...

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

Coutty 15-07-2008 18:59 852302

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

gasha 15-07-2008 22:33 852500

Возьму на заметку, спасибо.

gasha 18-07-2008 12:36 855221

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 855324

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

gasha 18-07-2008 16:05 855493

Совсем туплю...

<?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>";}
}
?>


Время: 18:34.

Время: 18:34.
© OSzone.net 2001-