Показать полную графическую версию : 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
<?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 (свой двигатель шаблонов делал), у него этих проблем не было бы, но он давно утерян :(
Если нужны только имена картинок, то я бы так написал:
preg_match_all("/[a-zA-Z0-9_-]{1,50}\.(png|gif|jpg)/",$string,$result);
В этом случае все имена картинок будут лежать в массиве $result[0]
vadimiron
09-08-2004, 01:49
:) Это был я, куда то кука моя делась-иеня не признали:(
Кто-нибудь может подсказать в чем проблема?
Значит так, возникла необходимость проверить все письма пришедшие на 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.., т.е. те которые содержали символ подчеркивания. Не пойму в чем дело. Пытался использовать другие регулярные выражения, но безрезультатно.
Может проблема заключается в чем-то другом?
И еще, проверил, что если указать номер письма (где содержатся 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() возвращает все письмо в виде простого текста.
Сорри, нашел проблему.
Регулярка тут не причем, просто, надо было вынести preg_match_all() из цикла и проверить весь текст писем
или же объединять массив $emails с другим массивом... ну или еще как-нибудь
Вот строка [1][0], 0.15, 0.18, 0.16
Нужно из неё выцепить 0.15 0.18 и 0.16
Числа могут меняться, но, в любом случае, они будут дробными.
Помогите, пожалуйста.
Решил самостоятельно...
$reg = "/[\d]{1,2}\.[\d]{1,2}/s";
preg_match_all ($pattern, $text, $res);
gasha, а нельзя строку просто обработать explode'ом?
Скажем, $data = explode(',', $string); а потом просто проверять каждый элемент, конвертируется во float или нет: is_float(trim($data[$i]);
Возьму на заметку, спасибо.
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
Это структура оригинала из которго нужно выцепить числа, здесь один столбик, но их может быть несколько.
gasha, так я ж для примера...
Можно в проверке писать if (substr($data[$i], 0, 1) != "[" && is_float(trim($data[$i])) { ... }
Т.е. если первый символ - не квадратная скобка и число конвертируется во float - значит пойдёт.
Совсем туплю...
<?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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.