2016-11-05 6 views
1

В настоящее время я пытаюсь создать игру призрака, и это мой php-файл, который использует регулярное выражение для обновления строки в моем html-файле, в котором перечислены все буквы, которые могут быть сформируйте слово, следующее за строкой. (например, для liche, он будет эхо n для возможных букв). Кроме того, у меня есть текстовый файл со всеми словами в английском словаре, из которого я извлекаю данные для preg_match_all(). Однако мой код не возвращает ничего, и я не уверен, почему.Regex (PHP) для поиска всех совпадений, начинающихся с строки набора

Цикл for специфичен для призрака игры. Правила игры предназначены для каждого игрока, чтобы сказать письмо с целью формирования слова. Однако тот, кто произносит последнюю букву, которая образует слово, выигрывает. Например, если человек 1 говорит Z, человек 2 говорит E, p1 говорит B, p2 говорит R, то p1 будет проигрывать, потому что единственная возможная буква слева - это A, которая сформирует полное слово. Однако правило, которое заставило меня создать это для цикла, заключалось в том, чтобы исключить все слова длиной до 3 слов (a, a, cat и т. Д.)

Если бы я должен был ввести строку loa (полученную REQUEST), то все слова в файле wordsEn.txt, который начался с loa, будут добавлены в массив. Оттуда следующая буква после loa будет добавлена ​​к строке s1 (при этом повторяющиеся буквы не повторяются, n не следует повторять дважды для кредитов и займов). Lasty, это будет echo s1, который позже будет использоваться в html.

<?php 
$contents=file_get_contents('wordsEn.txt'); 
    $a=$_REQUEST['word'];//gets current combo from the url 
    $pattern='/^'+$a+'.*/'; 
    $length=strlen($a); 
    $letters=''; 
    if(preg_match_all($pattern,$contents,$matches)){ 
     for($n=0; $n<count($matches); $n++){ 
      if($length>3 and $matches[$n]==$a){// if it is a word with length over 3 
       $n=$length+4; 
       $letters='';//no matches 
      } 
      else{ 
       $next=$matches[$n]+''; 
       $temp=substr($next, $length-1, $length); //get the next letter 
       if(strpos($letters, $temp)==FALSE){ 
        $temp=substr($next, $length-1, $length); 
        $letters+=$temp; 
       } 
      } 
     } 
     echo($letters); 
    } 

>

+0

Добро пожаловать в SO! Надеюсь, вы найдете сайт полезным. По моему опыту, обучение использованию сайта также помогло мне лично вырасти как разработчик. Это отличное начало задавать хороший вопрос. У вас есть представление о том, чего вы хотите достичь, и это имеет смысл интуитивно, однако в нем отсутствует пример того, что вы пробовали вместе с результатами, которые вы наблюдали, и желаемым результатом.Пожалуйста, подумайте над тем, чтобы добавить их, чтобы другие пользователи могли протестировать ваш код и предоставить вам код, который вам полезен. – Bobby

+0

Спасибо! Я добавил дополнительные сведения о проекте, над которым я работаю, и надеюсь, что это сделает его более понятным для других. – mlin

+0

В вашем коде есть ошибки. Конкатенация строк выполняется через '.' not' + '; '$ matches' является многомерным, поэтому' $ matches [n] '- это массив, а не строка; почему вы делаете '$ n = $ length + 4;'? Я уверен, что '$ next = $ matches [$ n] + '';' не делает то, что вы думаете ........ – Toto

ответ

1

вы можете попробовать это регулярное выражение

(pa)[a-zA-Z0-9]+ 

здесь демо:

https://regex101.com/r/pUeIvw/1

в PHP можно реализовать как этот

DEMO: http://phpio.net/s/d37

+0

это работает или нет, или вы хотите что-то еще – EaBangalore

+0

Не могли бы вы посмотрите мой новый вопрос? Я сделал это более конкретным и предоставил больше кода. – mlin

+0

ok скажите, что вы хотите найти? скажите мне строку – EaBangalore

1

Это так же просто, как:

^pa.* 

Где:

^ : is an anchor that means begining of string 
pa : literally letter "p" followed by letter "a" 
.* : any character (.) present 0 or more times (*) 

Редактировать в соответствии с вопросительным переформулировке:

Узор вы loking для:

$pattern = "/^$a.*/"; 

или, более ограничительный:

$pattern = "/^$a\w*/"; 

Я не понимаю, цели для цикла, пожалуйста, объясните, что вы хотите сделать, и добавить в своем вопросе некоторых выборок входные строки - ожидаемый результат.

+0

Цикл for специфичен для игрового призрака. Правила игры предназначены для каждого игрока, чтобы сказать письмо с целью формирования слова. Однако тот, кто произносит последнюю букву, которая образует слово, выигрывает. Например, если человек 1 говорит Z, человек 2 говорит E, p1 говорит B, p2 говорит R, то p1 будет проигрывать, потому что единственная возможная буква слева - это A, которая сформирует полное слово. Однако правило, которое заставило меня создать это для цикла, состояло в том, чтобы исключить все слова длиной до 3 слов (a, a, cat и т. Д.) – mlin

+0

Если бы я должен был ввести строку loa (полученную REQUEST) то все слова в файле wordsEn.txt, который начался с loa, будут добавлены в массив. Оттуда следующая буква после loa будет добавлена ​​к строке s1 (при этом повторяющиеся буквы не повторяются, n не следует повторять дважды для кредитов и займов). Lasty, это будет echo s1, который позже будет использоваться в html. – mlin

+0

@mlin: Я не понимаю, почему вы зацикливаете от '0' до' strlen ($ a) 'и используете этот показатель для массива' $ matches', который не имеет смысла – Toto