preg_match или аналогичный, чтобы получить значение из строки - PullRequest
1 голос
/ 24 января 2011

Я не в восторге от preg_match или подобных функций, которые не устарели.

Вот 2 строки:

  1. /Cluster-Computers-c-10.html

  2. /Mega-Clusters-c-15_32.html

Я бы выяснил:

В примере с номером 1, как получить значение от -c- до .html (значение в примере - 10). Значение всегда является целым числом (числовым)

В примере с номером 2, как получить значение от -c- до .html (значение в примере - 15_32). Значение всегда является целым числом, разделенным на _

В основном я хочу проверить, имеет ли строка c-10.html или c-15_32.html, получить значение и передать его в базу данных.

Ответы [ 4 ]

3 голосов
/ 24 января 2011

Вы можете сделать:

preg_match('/-c-(\d+(?:_\d+)?)\.html$/i',$str);

Объяснение:

-c-     : A literal -c-
(       : Beginning of capturing group
 \d+    : one or more digits, that is a number
 (?:    : Beginning of a non-capturing group
   _\d+ : _ followed by a number
 )      : End of non-capturing group
 ?      : Makes the last group optional
)       : End of capturing group
\.      : . is a metacharacter to match any char (expect newline) to match 
          a literal . you need to escape it.
html    : a literal html
$       : End anchor. Without it the above pattern will match any part 
          of the input string not just the end.

Посмотреть

3 голосов
/ 24 января 2011
preg_match('~-c-(.*?)\.html$~', $str, $matches)
var_dump($matches);
1 голос
/ 24 января 2011
/-c-(\d+(?:_\d+)?)\.html$/i

-c- ищите -c-
(\d+(?:_\d+)?) номер совпадения или число-номер подчеркивания
\.html точка и конечный html
$ заставить его совпадать с концом строки
i совпадение без учета регистра

Пример:

<?php
  header('Content-Type: text/plain');
  $t = Array(
    '1) /Cluster-Computers-c-10.html',
    '2) /Mega-Clusters-c-15_32.html'
  );
  foreach ($t as $test){
    $_ = null;
    if (preg_match('/-c-(\d+(?:_\d+)?)\.html$/i',$test,$_))
      var_dump($_);
    echo "\r\n";
  }
?>

вывод:

array(2) {
  [0]=>
  string(10) "-c-10.html"
  [1]=>
  string(2) "10"
}

array(2) {
  [0]=>
  string(13) "-c-15_32.html"
  [1]=>
  string(5) "15_32"
}

Рабочий код: http://www.ideone.com/B70AQ

0 голосов
/ 24 января 2011

Самый простой способ, которым я вижу, будет:

preg_match( '/-c-([^.]+)\.html/i', $url, $matches );
var_dump( $matches );
...