テキスト内に含まれるURLに自動でリンクを張る、
そんなときはこんな感じ。
$x = ereg_replace("(https?|ftp)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)", "<a href=\"\\1\\2\" >\\1\\2</a>"\,$x);
[訂正][php]simplexml_load_fileでうまくパース出来ない、なんて事はない。& 正解とお手軽方法
ソーシャルブックマークに追加:
間違えた。
---------------------------------------------------------------------------------------
$string = preg_replace('/:/','_',file_get_contents(XMLのURL));
$xml = simplexml_load_string($string);
---------------------------------------------------------------------------------------
↓↓↓↓↓↓
---------------------------------------------------------------------------------------
$string = preg_replace('/:/','_',file_get_contents(XMLのURL));
$string = preg_replace('/http_\/\//','http://',$string);
$xml = simplexml_load_string($string);
---------------------------------------------------------------------------------------
これが無いと,URLも潰れちゃいますね。。
[php][正規表現]URLをリンクに変換する!
ソーシャルブックマークに追加:
[php]simplexml_load_fileでうまくパース出来ない、なんて事はない。& 正解とお手軽方法
ソーシャルブックマークに追加:
Magpie RSS - PHP RSS Parser-を使ってた人からすると若干の癖がある。
たとえば、
http://soccersns.jp/rss/diary.xml
これを
$xml=simplexml_load_file('http://soccersns.jp/rss/diary.xml');
こんな感じで取得すると、
<title>
<link>
<description>
はパースできるけど
<dc:format>
<dc:date>
<dc:source>
<dc:creator>
は$xmlには含まれていない。
で、
simplexml_load_fileは不完全だと騒ぐ。
で、
これをちゃんと取得するには、、
XMLでの:'コロン'は名前空間を表すので、
$dc=$xml->item[0]->children(名前空間定義のURL);
って感じで指定しなければいけない、
(ちなみに名前空間の定義はXMLのヘッダにxmlns:dc=http://purl.org/dc/elements/1.1/こんな感じで書いてある。)
$dc=$xml->item[0]->children('http://purl.org/dc/elements/1.1/');
echo $dc->format;
echo $dc->date;
echo $dc->source;
echo $dc->creater;
とこんな感じで取得するのが正解なのです。
が、
こんなのめんどくせぇから、
こうする↓
-----------------------------------------------------------------------------------
$string = preg_replace('/:/','_',file_get_contents(XMLのURL));
$xml = simplexml_load_string($string);
-----------------------------------------------------------------------------------
ようは名前空間を表す、:'コロン'を違う文字に変えてから
simplexml_load_stringでパース。
ようはパースできればいいわけだから。
[php]get_headersを使ってデッドリンクを調べる
ソーシャルブックマークに追加:
気が向いたので、
get_headers
を使ってデッドリンクを調べるものを作ってみました。
まず、
get_headers
はヘッダを取得するもので
Array
(
[0] => HTTP/1.1 200 OK
[1] => Date: Sat, 29 May 2004 12:28:13 GMT
[2] => Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
[3] => Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT
[4] => ETag: "3f80f-1b6-3e1cb03b"
[5] => Accept-Ranges: bytes
[6] => Content-Length: 438
[7] => Connection: close
[8] => Content-Type: text/html
)
こんなのが返ってきます。
なので、[0]を見ればデッドリンクかわかるので、
function deadlink($uri){
$head = get_headers($uri,1);
$response = $head[0];
if (!preg_match('/Not Found/',$response)){
//生きてるYO!!
return false;
}else{
//死んでるYO!!
return true;
}
}
こんな感じにして、
これを、使って
function deadlchk(){
$uri=$_GET['uri'];
$arr=array();
//そのHTMLのURLリストを取得
preg_match_all("/(https?:\/\/[^\"]+)/i" ,file_get_contents($uri), $arr1);
foreach($arr1[0] as $arr1_one){
//配列に。
array_push($arr,$arr1_one);
//ちょっと休憩
sleep(2);
//HTML取得
preg_match_all("/(https?:\/\/[^\"]+)/i" ,file_get_contents($arr1_one), $arr2);
//グルグル
foreach($arr2[0] as $arr2_one){
array_push($arr,$arr2_one);
}
}
//重複削除
$arr = array_unique($arr);
for($ii=1;$ii<count($arr[0]);$ii++){
sleep(2);
$uri=$arr[0][$ii];
if($this->deadlink($uri)){
echo "死んでるYO!! " . htmlspecialchars($uri) . "<br>";
}else{
echo "生きてるYO!! " . htmlspecialchars($uri) . "<br>";
}
}
}
こんな感じでとりあえず、したいことが出来ました。