Strpos с целым числом и словом

Я застрял. Не обращайте внимания на верхнюю строку, дата пока не используется, но скоро будет использоваться. Возникли проблемы в первую очередь с этой строкой:

  if(strpos($line, $extension) !== false and (preg_match('#\d#',$line !== false))){

Я пытаюсь сделать так, чтобы если доменное имя ($ line) было .com и не имело номеров, то повторите его. Кажется, что все preg_replace и strlen работают, но я не могу заставить их работать только так, как мне нужно. Мне нужно поместить preg_match вне правила ‹=40, так как это может вызвать путаницу?

<?php

date_default_timezone_set('UTC');

$extension = '.com';
$lines = file('PoolDeletingDomainsList.txt');

echo "<b>4 Letter premiums for ". date("n/j/Y") .":</b><br />";

foreach($lines as $line)

if(strlen($line)<=40) {

{
  // Check if the line contains the string we're looking for, and print if it does
  if(strpos($line, $extension) !== false and (preg_match('#\d#',$line !== false))){
    $line = preg_replace('/12:00:00 AM,AUC\b/','<br />', $line);
    $line = preg_replace('/,9\/28\/2013/', '', $line);
    echo $line;
  }
}
}

?>

person Dadsquatch    schedule 28.09.2013    source источник
comment
I need ot put the preg_match outside of the <=40 rule as it may be causing confusion -- не знаю, что вы имеете в виду.   -  person Amal Murali    schedule 28.09.2013
comment
Не уверен, будет ли это иметь значение, если я поставлю его над разделом if(strlen($line)‹=40) как собственный оператор if.   -  person Dadsquatch    schedule 28.09.2013
comment
Приведенный выше код работает не так, как вы ожидали? Какие проблемы?   -  person Amal Murali    schedule 28.09.2013
comment
Он либо вообще ничего не возвращает, либо домены .com с номерами. Единственное, что я меняю, это !==false на == false в конце preg_match()   -  person Dadsquatch    schedule 28.09.2013
comment
Эта проблема решилась? Если да, то отметьте один из ответов правильным :)   -  person Amal Murali    schedule 28.09.2013


Ответы (3)


Возвращаемые значения

preg_match() возвращает 1, если шаблон соответствует данному субъекту, 0, если нет, или FALSE, если произошла ошибка.

Preg_match вручную

  if(strpos($line, $extension) !== false and (preg_match('#\d#',$line) !== false))){
    $line = preg_replace('/12:00:00 AM,AUC\b/','<br />', $line);
    $line = preg_replace('/,9\/28\/2013/', '', $line);
    echo $line;
  }

заменить

if ((false !== strpos($line, $extension)) && (1 === preg_match('#\d#',$line))){
    $line = preg_replace('/12:00:00 AM,AUC\b/','<br />', $line);
    $line = preg_replace('/,9\/28\/2013/', '', $line);
    echo $line;
}

Это проверит, содержит ли $line .com и числа (иначе этим preg_replace не с чем было бы работать).

person OIS    schedule 28.09.2013

Согласно документации preg_match:

preg_match() возвращает 1, если шаблон соответствует данному субъекту, 0``, если нет, или FALSE, если произошла ошибка.

Таким образом, в соответствии с вашим текущим условием оператор if будет оцениваться как TRUE, если preg_match возвращает любое значение, отличное от FALSE (включая 1 и 0). И preg_match возвращает 1, если совпадение найдено, поэтому все ваши домены будут соответствовать условию и будут отображены.

Чтобы исправить ошибку, измените оператор if на:

if(strpos($line, $extension) !== false && !preg_match('#\d#',$line)) {
person Community    schedule 28.09.2013

Итак, вы ищете домены .com, в которых нет номеров («домены премиум-класса»).

<?php

$lines = array(
    'example.com',
    'exa13mple.com',
    'domain.org',
    'google.com',
    '37signals.com'
);

foreach ($lines as $line)
{
    $matches = array();
    $isComDomain = preg_match('/\w+\\.com/', $line, $matches);
    $hasNoNumbers = !empty($matches) ? preg_match('/^[a-zA-Z]+\\.com$/', $matches[0]) : false;

    if ($isComDomain && $hasNoNumbers) {
        print $matches[0] . "\n";
    }
}

isComDomain — это логическое значение, указывающее, нашел ли он [символы слова].com из строки. И если он нашел, он сохраняет найденное доменное имя в $matches[0].

Тогда hasNoNumbers является логическим значением, указывающим, содержит ли доменное имя .com только символы от az и AZ. Вы можете включить "-" в регулярное выражение, если разрешаете тире.

person joonas.fi    schedule 28.09.2013
comment
Может ли человек, который понизил мой ответ, объяснить причину понижения? - person joonas.fi; 28.09.2013