preg_match: убедитесь, что начало и конец содержат что-то - PullRequest
5 голосов
/ 17 августа 2010

Я хочу иметь регулярное выражение, которое гарантирует, что начало строки содержит 'http://' и' / 'и конец.

Это более длинная версия, которую я придумал,

if(!preg_match("/(^http:\/\//", $site_http)) 
{
 $error = true;
 echo '<error elementid="site_http" message="site_http - Your link appears to be invalid. Please confirm that your link contains http:// at the start."/>';
}
elseif (!preg_match("/\/$/", $site_http)) 
{
 $error = true;
 echo '<error elementid="site_http" message="site_http - Your link appears to be invalid. Please confirm that your link has ended with a /."/>';
}

но я подумал, что эти два выражения можно сложить, как показано ниже, но это не сработает,

if(!preg_match("/(^http:\/\/)&(\/$)/", $site_http)) 
{
 $error = true;
 echo '<error elementid="site_http" message="site_http - Your link appears to be invalid. Please confirm that your link contains http:// at the start and a / at the end."/>';
}

несколько выражений, которые я пытаюсь объединить, должны быть неправильными!есть идеи?

спасибо, Лау

1 Ответ

10 голосов
/ 17 августа 2010
if(preg_match('/^http:\/\/.*\/$/', $site_http)) 
{
  ...
}

^http:\/\/ заставляет http:// спереди, \/$ вызывает косую черту в конце, а .* разрешает все (и, возможно, ничего) между.:

<?php

foreach (array("http://site.com.invalid/", "http://") as $site_http) {
  echo "$site_http - ";
  if (preg_match('/^http:\/\/.*\/$/', $site_http)) {
    echo "match\n";
  }
  else {
    echo "no match\n";
  }
}
?>

генерирует следующий вывод:

http://site.com.invalid/ - match
http:// - no match
...