2016-10-04 3 views
1

Я пытаюсь найти, как найти совпадение в строке. Я ищу совпадение по любому из следующих - = ? [] ~ # ! 0 - 9 A-Z a-z, и мне нужно знать, с чем это связано.php - найти совпадение в строке

Например: соответствие на ! или согласованы на = и # и ?

Обычно я хотел бы использовать это:

$a = 'How are you?'; 

if (strpos($a, 'are') !== false) { 
    echo 'true'; 
} 

Однако я не уверен, как это сделать, так что смотрит персонажи нужны. Кроме того, где у меня может быть [], оно может быть [] или [xxxx] где xxxx может быть любым числом буквенно-цифровых символов.

Мне нужно сопоставить и любые из перечисленных символов, вернуть символы, чтобы я знал, что было сопоставлено, и если [] содержит любое значение, возвращаем это значение.

Например:

$a = 'DeviceLocation[West12]'; вернуться бы: $match = '[]'; $match_val= 'West12';

$a = '#=Device'; вернуться бы: $match = '#,=';

$a= '?[1234]=#Martin'; вернуться бы: $match = '?, [], =, #'; $match_val= '1234';

Может ли один совет, как я могу это сделать. Спасибо

+0

'DeviceLocation [West12]', что вы хотите найти в этой строке? –

+0

Попробуйте 'if (preg_match ('/ [] [A-Za-z0-9! # ~? = -] /', $ str, $ m)) {echo" Соответствует: ". $ М [0]; } ' –

+0

@OwaisArain - я хочу совместить с [] и, если возможно, захватить значение между ними. – Rocket

ответ

1

Ну, что требования немного расплывчатым, но это то, что я вывел:

1) если есть буквенно-цифровая строка внутри квадратных скобок получить его в виде отдельного значения
2) все остальные упомянутые символы должны быть отмечены один по одному, а затем implode d.

Вы можете использовать следующее регулярное выражение, чтобы получить необходимые значения:

$re = '@\[([a-zA-Z0-9]+)\]|[][=?~#!]@'; 

Детали:

  • \[ - это [
  • ([a-zA-Z0-9]+) - 1 значение группы захвата 1 или более буквенно-цифровые символы
  • \] - закрывающий ]
  • | - или
  • [][=?~#!] - один символ, один из определенных символов в наборе.

См. regex demo. Наиболее важным здесь является код, который получает матчи (чувствовать себя свободно адаптировать):

$re = '@\[([a-zA-Z0-9]+)\]|[][=?~#!]@'; 
$strs =array('DeviceLocation[West12]', '#=Device', '?[1234]=#Martin'); 

foreach ($strs as $str) { 
    preg_match_all($re, $str, $matches, PREG_SET_ORDER); 
    $results = array(); 
    $match_val = ""; 
    foreach ($matches as $m) { 
     if (!empty($m[1])) { 
      $match_val = trim($m[1], "[]"); 
      array_push($results, "[]"); 
     } else { 
      array_push($results, $m[0]); 
     } 
    } 
    echo "Value: " . $match_val . "\n"; 
    echo "Symbols: " . implode(", ", $results); 
    echo "\n-----\n"; 
} 

См PHP demo

Выход:

Value: West12 
Symbols: [] 
----- 
Value: 
Symbols: #, = 
----- 
Value: 1234 
Symbols: ?, [], =, # 
----- 
+1

, что выглядит идеально. Спасибо. – Rocket

+0

Я хотел бы превратить это в функцию. Как вернуть значение и символы отдельно? – Rocket

+0

Вы можете вернуть массив. См. Http://stackoverflow.com/questions/3451906/multiple-returns-from-функция. –

0

Вам нужно regular expressions, чтобы проверить текст внутри другого с различными свойствами, вот простой учебник по этой ссылке.

1

Пожалуйста, используйте регулярные выражения, например, с помощью preg_match

1

Попробуйте

Это будет соответствовать строке в []

preg_match_all("/\[([^\]]*)\]/", $text, $matches); 

И это будет соответствовать строка после ? и #=

preg_match_all("/^#=(\S+)|\?(.*)/", $text, $matches); 

var_dump($matches); 
+0

OP не нужно извлекать все тексты в квадратных скобках. См. Вопрос: * Например: сопоставлено с '!' Или сопоставляется с '=' и '#' и '?' * –