Вернуться   SEO форум - оптимизация и продвижение сайтов > Web разработки > Программирование

Важная информация
Программирование - PHP, MySQL, JavaScript, CSS, HTML верстка и т.д.

Ответ
 
Опции темы Оценить тему Опции просмотра
Старый 20.05.2010, 16:52   #1
 
Аватар для aslobodyan
 
Сообщений: 107
FR (активность): 1,441

Доп. информация
По умолчанию Автор темы Помогите с РНР

Есть у меня функа на РНР для выборки внутренностей МЕТА-тегов любого ресурса.

[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 возвращает значение "Не смог определить".

Вот собсно и просьба к знатокам РНР: помогите мне, пожалуйста, так переписать эту функу, чтоб она не была чувствительна к перестановке этих атрибутов тега МЕТА. Заранее спасибо!


Все будет хорошо! Я узнавал
aslobodyan вне форума  
Ответить с цитированием Сказать Плохо за это бесполезное сообщение Быстрый ответ на это сообщение
Старый 20.05.2010, 22:50   #2
 
Аватар для Sezarin
 
Сообщений: 14
FR (активность): 187

Доп. информация
По умолчанию Re: Помогите с РНР

Вместо preg_match попробуйте preg_match_all.

А шаблон, наверное, лучше построить следующим образом:
[PHP]$search = '/<[\s]*meta[\s]*(name|http-equiv)[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*content[\s]*=[\s]*["\']?([^>"\']*)["\']?[\s]*[\/]?[\s]*>/si';[/PHP]
Sezarin вне форума  
Ответить с цитированием Сказать Плохо за это бесполезное сообщение Быстрый ответ на это сообщение
Старый 20.05.2010, 23:47   #3
 
Аватар для aslobodyan
 
Сообщений: 107
FR (активность): 1,441

Доп. информация
По умолчанию Автор темы Re: Помогите с РНР

Что-то не то...

работает оно у меня с помощью той функи, которую я описал выше - так:
[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. Но у меня не получаетсО написать его правильно... вот и прошу, мож кто шарющий поможет...ато я уже за сегодняшний день чуть голову себе не сломал теми регекспами.


Все будет хорошо! Я узнавал
aslobodyan вне форума  
Ответить с цитированием Сказать Плохо за это бесполезное сообщение Быстрый ответ на это сообщение
Старый 21.05.2010, 09:31   #4
 
Аватар для Sezarin
 
Сообщений: 14
FR (активность): 187

Доп. информация
По умолчанию Re: Помогите с РНР

Цитата:
Сообщение от aslobodyan Посмотреть сообщение
Что-то не то...
Что не то? Если не работает в том виде, который имеется - нужно что-то менять...

Это прекрасно работает в ревесном режиме, тестируйте:
[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]
Sezarin вне форума  
Ответить с цитированием Сказать Плохо за это бесполезное сообщение Быстрый ответ на это сообщение
"Спасибо" от:
aslobodyan (21.05.2010)
Старый 21.05.2010, 15:56   #5
 
Аватар для aslobodyan
 
Сообщений: 107
FR (активность): 1,441

Доп. информация
По умолчанию Автор темы Re: Помогите с РНР

Спасибо Вам 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 ('<', '&lt;', $path);
$path = str_replace ('>', '&gt;', $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>&nbsp;</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."&nbsp;(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 дня мучаюсь ....


Все будет хорошо! Я узнавал
aslobodyan вне форума  
Ответить с цитированием Сказать Плохо за это бесполезное сообщение Быстрый ответ на это сообщение
Старый 21.05.2010, 18:22   #6
 
Аватар для Sezarin
 
Сообщений: 14
FR (активность): 187

Доп. информация
По умолчанию Re: Помогите с РНР

Этот код в Вашем случае будет работать:
[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 ('<', '&lt;', $path);
$path = str_replace ('>', '&gt;', $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>&nbsp;</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."&nbsp;(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]
Sezarin вне форума  
Ответить с цитированием Сказать Плохо за это бесполезное сообщение Быстрый ответ на это сообщение
"Спасибо" от:
aslobodyan (22.05.2010)
Старый 22.05.2010, 22:24   #7
 
Аватар для aslobodyan
 
Сообщений: 107
FR (активность): 1,441

Доп. информация
По умолчанию Автор темы Re: Помогите с РНР

Спасибо вам, Sezarin, но все-равно оно не срабатывает так, как надо... вот к примеру есть сайт моего знакомого list.if.ua... у него там слишком много МЕТА-тегов и все написаны в разных последовательностях... проверте сами.... скрипт работает не так, как хотелось бы... оно к примеру кодировку выводит, а уже все остальное не выводит....

Я вам в любом случаи благодарен. Всетки мне надо будет самому регекспы раздуплить до такой степени, чтоб я сам все поправил) Я уже итак за эти дни столько статтей по этому перечитал, что мама дорогая)))
Когда все будет готово - выложу обязательно тут)


Все будет хорошо! Я узнавал
aslobodyan вне форума  
Ответить с цитированием Сказать Плохо за это бесполезное сообщение Быстрый ответ на это сообщение
Ответ

Быстрый ответ
Ваше имя пользователя: Регистрация. Для входа нажмите здесь
Случайный вопрос

Сообщение:
Опции
Внимание!
Этой теме более 4379 дней. Вы можете оставить сообщение здесь. Но, обращаем внимание. Возможно, рациональней создать новую тему (найти свежее обсуждение)?


Опции темы
Опции просмотра Оценка этой теме
Оценка этой теме:

Ваши права в разделе
Вы не можете создавать новые темы
Вы можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

Текущее время: 09:51. Часовой пояс GMT +3.