配列に分割された文字列をpreg_matchと照合して、wwwで始まっているかどうかを確認するにはどうすればよいか疑問に思いました。 http:// www をチェックするものがすでにあります。
function isValidURL($url)
{
return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url);
}
$stringToArray = explode(" ",$_POST['text']);
foreach($stringToArray as $key=>$val){
$urlvalid = isValidURL($val);
if($urlvalid){
$_SESSION["messages"][] = "NO URLS ALLOWED!";
header("Location: http://www.domain.com/post/id/".$_POST['postID']);
exit();
}
}
ありがとう!ステファン
あなたは次のようなものが欲しいです:
%^((https?://)|(www\.))([a-z0-9-].?)+(:[0-9]+)?(/.*)?$%i
これは|を使用しています最初にhttp://
またはwww
のいずれかに一致します。 %
との衝突を避けるために、区切り文字を|
に変更しました
Daring FireballのJohn Gruberが、関心のあるすべてのタイプのURLに対して非常に包括的な正規表現を投稿しました。あなたはそれをここで見つけることができます:
http://daringfireball.net/2010/07/improved_regex_for_matching_urls
URLが文字列の途中にある可能性があるため、最初は文字列を分解します。 hello how are you www.google.com
文字列を分解し、foreach
ステートメントを使用します。
例えば:
$string = "hello how are you www.google.com";
$string = explode(" ", $string);
foreach ($string as $Word){
if ( (strpos($Word, "http://") === 0) || (strpos($Word, "www.") === 0) ){
// Code you want to excute if string is a link
}
}
strpos
は返すことができ、===
はfalse
のように見えるため、0
演算子を使用する必要があります。
以下でこれを使用しました。これにより、文字列内の任意の場所でURLを検出できます。私の特定のアプリケーションでは、スパムと戦うための連絡フォームなので、URLは許可されていません。非常にうまく機能します。
リソースへのリンク: https://css-tricks.com/snippets/php/find-urls-in-text-make-links/
私の実装;
<?php
// Validate message
if(isset($_POST['message']) && $_POST['message'] == 'Include your order number here if relevant...') {
$messageError = "Required";
} else {
$message = test_input($_POST["message"]);
}
if (strlen($message) > 1000) {
$messageError = "1000 chars max";
}
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
if (preg_match($reg_exUrl, $message)) {
$messageError = "Url's not allowed";
}
// Validate data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>