|
|
Помогите с РНР |
|
Программирование - PHP, MySQL, JavaScript, CSS, HTML верстка и т.д. |
![]() |
|
Опции темы | Оценить тему | Опции просмотра |
![]() |
#1 |
|
![]() ![]() Есть у меня функа на РНР для выборки внутренностей МЕТА-тегов любого ресурса.
[PHP] function Meta_Teg ( $path, $content ){ $search = "~<meta[?>]*[?=]*=[ '\"\n\r\t]*" . preg_quote ( $path ,"~" ) . "[ '\"\n\r\t]*content[?=]*=[ '\"\n\r\t]*" . "([?\"'>\r\n\t#]+)[?>]*>~si"; if ( preg_match ( $search, $content, $array ) ) { return _Replace ( $array[1] ); } return "Не смог определить"; } [/PHP] Но в этой функи есть как минимум 1 очень большой минус, то есть если МЕТА-тег имеет правильную структуру, то есть сначала идет name="", а потом content="" - тогда все работает намана. [HTML]<meta name="keywords" content="бла-бла-бла" />[/HTML] Но есть уникумы, которые прописывают это все вот так (наоборот): [HTML]<meta content="бла-бла-бла" name="keywords" />[/HTML] С точки зрения HTML это не есть ошибка, ибо HTML-лю безразлично, в каком порядке стоят эти аттрибуты, но для моего бота пока есть большая разница. В случаи с неправильной расстановкой аттрибутов в МЕТА-теге функа Meta_Teg возвращает значение "Не смог определить". Вот собсно и просьба к знатокам РНР: помогите мне, пожалуйста, так переписать эту функу, чтоб она не была чувствительна к перестановке этих атрибутов тега МЕТА. Заранее спасибо! ![]() Все будет хорошо! Я узнавал
![]() |
![]() |
![]() ![]() ![]() |
![]() |
#2 |
|
![]() Вместо preg_match попробуйте preg_match_all.
А шаблон, наверное, лучше построить следующим образом: [PHP]$search = '/<[\s]*meta[\s]*(name|http-equiv)[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*content[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*[\/]?[\s]*>/si';[/PHP] |
![]() |
![]() ![]() ![]() |
![]() |
#3 |
|
![]() ![]() Что-то не то...
работает оно у меня с помощью той функи, которую я описал выше - так: [PHP] $content = implode ( '', file ( $meta_infa )); .... $_Type = Meta_Teg ('Content-Type', $content); $_Author = Meta_Teg ('Author', $content); $_Keywords = Meta_Teg ('Keywords', $content); $_Description = Meta_Teg ('Description', $content); $_Cache = Meta_Teg ('Cache-Control', $content); $_Language = Meta_Teg ('Content-Language', $content); $_Modified = Meta_Teg ('Last-Modified', $content); $_Expires = Meta_Teg ('Expires', $content); [/PHP] т.е. мы пишем у функу то, что будет в name="" какого-то МЕТА-тега, а оно возвращает его content="". ... задача кагбэ состоит именно в том, чтобы правильно переписать сам патерн $search в функе Meta_Teg. Но у меня не получаетсО написать его правильно... вот и прошу, мож кто шарющий поможет...ато я уже за сегодняшний день чуть голову себе не сломал теми регекспами. ![]() Все будет хорошо! Я узнавал
![]() |
![]() |
![]() ![]() ![]() |
![]() |
#4 |
|
![]() Что не то? Если не работает в том виде, который имеется - нужно что-то менять...
Это прекрасно работает в ревесном режиме, тестируйте: [PHP] function get_metatag_content ($content=NULL) { if (preg_match_all ('/<[\s]*meta[\s]*(name)[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*content[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*[\/]?[\s]*>/si', $content, $matches)) { if (!empty ($matches) && is_array ($matches) && count ($matches[2]) == count ($matches[3])) { echo $matches[2][0] . ' == ' . $matches[3][0]; } } elseif (preg_match_all ('/<[\s]*meta[\s]*(content)[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*name[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*[\/]?[\s]*>/si', $content, $matches)) { if (!empty ($matches) && is_array ($matches) && count ($matches[2]) == count ($matches[3])) { echo $matches[3][0] . ' == ' . $matches[2][0]; } } } //$site_content = '<meta name="keywords" content="бла-бла-бла" />'; $site_content = '<meta content="бла-бла-бла" name="keywords" />'; get_metatag_content ($site_content); [/PHP] |
![]() |
![]() ![]() ![]() |
"Спасибо" от: | aslobodyan (21.05.2010) |
![]() |
#5 |
|
![]() ![]() Спасибо Вам Sezarin.
Ваш вариант работает, но немножко не так, как хотелось бы. А я сам не настолько шарю РНР, чтобы склеить со всего то, что надо. Вот собсно все что есть (весь скрипт целиком): [PHP] if ( isset ($_GET) ) { foreach ( $_GET as $key=>$val ) { $$key = $val; } } if ( isset ($_POST) ) { foreach ( $_POST as $key=>$val ) { $$key = $val; } } // дополнительная функция, удаляющая плохие символы function _Replace ($path){ $path = trim ( preg_replace ("/[^\x20-\xFF]/","", strval ($path) ) ); $path = str_replace ('<', '<', $path); $path = str_replace ('>', '>', $path); return preg_replace ("~[ ]+~s"," ", $path); } // основная функция Мета тега function Meta_Teg ( $path, $content ){ $search = "~<meta[^>]*[^=]*=[ '\"\n\r\t]*" . preg_quote( $path ,"~" ) . "[ '\"\n\r\t]*content[^=]*=[ '\"\n\r\t]*" . "([^\"'>\r\n\t#]+)[^>]*>~si"; if ( preg_match ( $search, $content, $array ) ) { return _Replace ( $array[1] ); } return "не указано"; } print " <br><br> <form ACTION='" . basename ($_SERVER['PHP_SELF']) . "?act=meta_teg' METHOD='POST'> <b>Статистика сайта:</b> <input type='text' name='meta_infa' size='25' value='http://'> <input type='submit' value='Проверить'> </form> <p> </p><br /><br /> "; // если пользователь только пришёл, говорим: "Введи имя страницы" if (!$meta_infa){ print "<p>Введите адрес для проверки.</p>\n"; } else { $content = implode ( '', file ( $meta_infa )); if ($content == ''){ print "<p>Не смог открыть: ".$meta_infa."</p>\n"; } else { if ( preg_match ("~<(title)[^>]*>(.*)</\\1[^>]*>~isU" , $content,$arr ) ){ $_Title = _Replace ( $arr[2] ); } else { $_Title = "Нету названия"; } $_Strlen = strlen ($content); $_Strlen = $_Strlen / 1024; $_Strlen = round($_Strlen, 1); $_Type = Meta_Teg ('Content-Type', $content); $_Author = Meta_Teg ('Author', $content); $_Keywords = Meta_Teg ('Keywords', $content); $_Description = Meta_Teg ('Description', $content); $_Cache = Meta_Teg ('Cache-Control', $content); $_Language = Meta_Teg ('Content-Language', $content); $_Modified = Meta_Teg ('Last-Modified', $content); $_Expires = Meta_Teg ('Expires', $content); print " <table border='0' width='100%' cellpadding='10' cellspacing='1'> <tr><td colspan='2'>".$meta_infa."</td></tr> <tr><td width=\"300\">Название страницы</td><td>".$_Title."</td></tr> <tr><td>Размер</td><td>".$_Strlen." (Kb)</td></tr> <tr><td nowrap>Тип и кодирование</td><td>".$_Type."</td></tr> <tr><td>Автор</td><td>".$_Author."</td></tr> <tr><td>Ключевые слова</td><td>".$_Keywords."</td></tr> <tr><td>Описание</td><td>".$_Description."</td></tr> <tr><td>Кешырование</td><td>".$_Cache."</td></tr> <tr><td>Язык сайта</td><td>".$_Language."</td></tr> <tr><td>Последняя модификация</td><td>".$_Modified."</td></tr> <tr><td nowrap>Будет работать до:</td><td>".$_Expires."</td></tr> </table></td></tr> </table>"; } } [/PHP] Ваш скрипт не дает возможности выводить все МЕТА-теги (он только для одного)..... + помогите мне пожалуйста просто подкорректировать мой паттерн $search для функи Meta_Teg так, чтобы он не зависел от перестановки атрибутов МЕТА-тега и плюс, чтобы он не был чувствительный к регистру букв (META или meta, NAME или name)... Буду Вам премного благодарен, ато я уже 2 дня мучаюсь .... ![]() Все будет хорошо! Я узнавал
![]() |
![]() |
![]() ![]() ![]() |
![]() |
#6 |
|
![]() Этот код в Вашем случае будет работать:
[PHP] if ( isset ($_GET) ) { foreach ( $_GET as $key=>$val ) { $$key = $val; } } if ( isset ($_POST) ) { foreach ( $_POST as $key=>$val ) { $$key = $val; } } // дополнительная функция, удаляющая плохие символы function _Replace ($path){ $path = trim ( preg_replace ("/[^\x20-\xFF]/","", strval ($path) ) ); $path = str_replace ('<', '<', $path); $path = str_replace ('>', '>', $path); return preg_replace ("~[ ]+~s"," ", $path); } // основная функция Мета тега function Meta_Teg ( $path, $content ){ if (preg_match ("~<meta[^>]*[^=]*=[ '\"\n\r\t]*" . preg_quote( $path ,"~" ) . "[ '\"\n\r\t]*content[^=]*=[ '\"\n\r\t]*" . "([^\"'>\r\n\t#]+)[^>]*>~si", $content, $array)) { return _Replace ( $array[1] ); } if (preg_match ("~<meta[^>]*content[^=]*=[ '\"\n\r\t]*" . "([^\"'>\r\n\t#]+)[^>]*[^=]*=[ '\"\n\r\t]*" . preg_quote( $path ,"~" ) . "[ '\"\n\r\t]*>~si", $content, $array)) { return _Replace ( $array[1] ); } return "не указано"; } print " <br><br> <form ACTION='" . basename ($_SERVER['PHP_SELF']) . "?act=meta_teg' METHOD='POST'> <b>Статистика сайта:</b> <input type='text' name='meta_infa' size='25' value='http://'> <input type='submit' value='Проверить'> </form> <p> </p><br /><br /> "; // если пользователь только пришёл, говорим: "Введи имя страницы" if (!$meta_infa){ print "<p>Введите адрес для проверки.</p>\n"; } else { $content = implode ( '', file ( $meta_infa )); if ($content == ''){ print "<p>Не смог открыть: ".$meta_infa."</p>\n"; } else { if ( preg_match ("~<(title)[^>]*>(.*)</\\1[^>]*>~isU" , $content,$arr ) ){ $_Title = _Replace ( $arr[2] ); } else { $_Title = "Нету названия"; } $_Strlen = strlen ($content); $_Strlen = $_Strlen / 1024; $_Strlen = round($_Strlen, 1); $_Type = Meta_Teg ('Content-Type', $content); $_Author = Meta_Teg ('Author', $content); $_Keywords = Meta_Teg ('Keywords', $content); $_Description = Meta_Teg ('Description', $content); $_Cache = Meta_Teg ('Cache-Control', $content); $_Language = Meta_Teg ('Content-Language', $content); $_Modified = Meta_Teg ('Last-Modified', $content); $_Expires = Meta_Teg ('Expires', $content); print " <table border='0' width='100%' cellpadding='10' cellspacing='1'> <tr><td colspan='2'>".$meta_infa."</td></tr> <tr><td width=\"300\">Название страницы</td><td>".$_Title."</td></tr> <tr><td>Размер</td><td>".$_Strlen." (Kb)</td></tr> <tr><td nowrap>Тип и кодирование</td><td>".$_Type."</td></tr> <tr><td>Автор</td><td>".$_Author."</td></tr> <tr><td>Ключевые слова</td><td>".$_Keywords."</td></tr> <tr><td>Описание</td><td>".$_Description."</td></tr> <tr><td>Кешырование</td><td>".$_Cache."</td></tr> <tr><td>Язык сайта</td><td>".$_Language."</td></tr> <tr><td>Последняя модификация</td><td>".$_Modified."</td></tr> <tr><td nowrap>Будет работать до:</td><td>".$_Expires."</td></tr> </table></td></tr> </table>"; } } [/PHP] |
![]() |
![]() ![]() ![]() |
"Спасибо" от: | aslobodyan (22.05.2010) |
![]() |
#7 |
|
![]() ![]() Спасибо вам, Sezarin, но все-равно оно не срабатывает так, как надо... вот к примеру есть сайт моего знакомого list.if.ua... у него там слишком много МЕТА-тегов и все написаны в разных последовательностях... проверте сами.... скрипт работает не так, как хотелось бы... оно к примеру кодировку выводит, а уже все остальное не выводит....
Я вам в любом случаи благодарен. Всетки мне надо будет самому регекспы раздуплить до такой степени, чтоб я сам все поправил) Я уже итак за эти дни столько статтей по этому перечитал, что мама дорогая))) Когда все будет готово - выложу обязательно тут) ![]() Все будет хорошо! Я узнавал
![]() |
![]() |
![]() ![]() ![]() |
|
Текущее время: 09:51. Часовой пояс GMT +3.
|