Регулярное выражение для слов от 3 до 16 символов в PHP - PullRequest
3 голосов
/ 05 марта 2010

Я совершенно новичок в регулярных выражениях, и мне нужно отфильтровать все слова длиной не менее 3 символов (и не более 16 символов) в тексте.(чтобы я мог ввести эти данные в базу данных MySQL)

В настоящее время все работает, кроме регулярного выражения:

/^.{3,16}$/

(я создал это из учебника, найденного с помощью Google; -))

Спасибо!Yvan

Пример данных:

rjm1986 * SinuhePalma * excel2010 * Jimineedles * 209663603 * C6A7XR * Snojog * XmafiaX * Cival2 * HitmanPirrie * MAX * 4163016 * Dredd23 * Daddy420 * mattpauley * Mykillurdeath * 244833585 * KCKnight * Greystoke * Fatbastard * Fucku4 * Davkar * Banchy2 * ET187 * Slayr69 * Nik1236 * SeriousAl * 315791 * 216996334 * K1ra * Koops1 * LastFallout * zmileben * bismark * Krlssi * FuckOff1 * 1owni * Ulme * Rxtvjq * halfdeadman * Jamacola * LBTG1008 * toypark * Magicman6497 * Tyboe187 * Bob187 * Zetrox

PHP-код (да, я знаю - это неаккуратно - это используется только для генерации запросов ...)

<?php
    //regexer.php

    $text = @$_REQUEST['fText'];
    if ($text == '') {
?>
<form method="post" action="">
    <input type="text" name="regex" />
    <textarea name="fText"></textarea>
    <br />
    <input type="submit"></input>
</form>
<?php 
    } else {
        preg_match_all($_REQUEST['regex'], $_REQUEST['fText'], $matches);
        header ("Content-type: text/plain");
        foreach ($matches as $match) {
            //print_r($match);
            echo ("INSERT INTO maf_codes (Code, GameID) VALUES ('$match', %GAMEID%);\n");
        }
    }
?>

Нашел решение: замените $ _REQUEST ['regex'] на регулярное выражение сработало;)

Ответы [ 4 ]

5 голосов
/ 05 марта 2010

Попробуйте это:

/\b\w{3,16}\b/

Разъяснения:

  • \b соответствует границе слова
  • \w соответствует символу слова
  • {3,16} применяется к \w и указывает, что должно быть найдено не менее 3 и не более 16 символов.

К вашему сведению: я опустил начальную привязку (^) и конечную привязку ($) в регулярном выражении, которое вы отметили в своем вопросе, потому что кажется, что вы хотите найти соответствия с более длинными строками текста в качестве ввода и якорями будет ограничивать сопоставление только теми случаями, когда вся входная строка совпадает.

UPDATE:

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

<?php

$input = 'rjm1986 * SinuhePalma * excel2010 * Jimineedles * 209663603 * C6A7XR * Snojog * XmafiaX * Cival2 * HitmanPirrie * MAX * 4163016 * Dredd23 * Daddy420 * mattpauley * Mykillurdeath * 244833585 * KCKnight * Greystoke * Fatbastard * Fucku4 * Davkar * Banchy2 * ET187 * Slayr69 * Nik1236 * SeriousAl * 315791 * 216996334 * K1ra * Koops1 * LastFallout * zmileben * bismark * Krlssi * FuckOff1 * 1owni * Ulme * Rxtvjq * halfdeadman * Jamacola * LBTG1008 * toypark * Magicman6497 * Tyboe187 * Bob187 * Zetrox';

$matches = array();

preg_match_all('/\b\w{3,16}\b/', $input, $matches);

print_r($matches);

?>

Выходы:

Array
(
    [0] => Array
        (
            [0] => rjm1986
            [1] => SinuhePalma
            [2] => excel2010
            [3] => Jimineedles
            [4] => 209663603
            [5] => C6A7XR
            [6] => Snojog
            [7] => XmafiaX
            [8] => Cival2
            [9] => HitmanPirrie
            [10] => MAX
            [11] => 4163016
            [12] => Dredd23
            [13] => Daddy420
            [14] => mattpauley
            [15] => Mykillurdeath
            [16] => 244833585
            [17] => KCKnight
            [18] => Greystoke
            [19] => Fatbastard
            [20] => Fucku4
            [21] => Davkar
            [22] => Banchy2
            [23] => ET187
            [24] => Slayr69
            [25] => Nik1236
            [26] => SeriousAl
            [27] => 315791
            [28] => 216996334
            [29] => K1ra
            [30] => Koops1
            [31] => LastFallout
            [32] => zmileben
            [33] => bismark
            [34] => Krlssi
            [35] => FuckOff1
            [36] => 1owni
            [37] => Ulme
            [38] => Rxtvjq
            [39] => halfdeadman
            [40] => Jamacola
            [41] => LBTG1008
            [42] => toypark
            [43] => Magicman6497
            [44] => Tyboe187
            [45] => Bob187
            [46] => Zetrox
        )

)
2 голосов
/ 05 марта 2010

Можете ли вы сказать, что именно не работает?Но в любом случае я думаю, что в вашем регулярном выражении вы должны использовать метасимвол границы слов \b:

/\b\w{3,16}\b/

Обновление: Это работает для меня.Это:

<?php
$a = array();

preg_match_all('/\b\w{3,16}\b/', "rjm1986 * SinuhePalma * excel2010 * Jimineedles * 209663603 * C6A7XR * Snojog * XmafiaX * Cival2 * HitmanPirrie * MAX * 4163016 * Dredd23 * Daddy420 * mattpauley * Mykillurdeath * 244833585 * KCKnight * Greystoke * Fatbastard * Fucku4 * Davkar * Banchy2 * ET187 * Slayr69 * Nik1236 * SeriousAl * 315791 * 216996334 * K1ra * Koops1 * LastFallout * zmileben * bismark * Krlssi * FuckOff1 * 1owni * Ulme * Rxtvjq * halfdeadman * Jamacola * LBTG1008 * toypark * Magicman6497 * Tyboe187 * Bob187 * Zetrox", $a);

print_r($a);

дает мне:

Array
(
    [0] => Array
        (
            [0] => rjm1986
            [1] => SinuhePalma
            [2] => excel2010
            [3] => Jimineedles
            [4] => 209663603
            //.... lot more here...
            [45] => Bob187
            [46] => Zetrox
        )

)

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

 foreach ($matches[0] as $match) {
        print_r($match);
        //...
 }

И вы должны объявить $matches, прежде чем использовать его:

$matches = array();
preg_match_all($_REQUEST['regex'], $_REQUEST['fText'], $matches);
1 голос
/ 05 марта 2010

Как уже говорили другие, это сделают следующие.

/\b\w{3,16}\b/g

Причина, по которой исходная строка (ниже) не сработала, заключается в следующем:

/^.{3,16}$/
  1. ^ и $ означают начало и конец строки. Похоже, вы хотите извлечь слова из строки.
  2. . будет соответствовать любому символу, включая пробелы или специальные символы.
0 голосов
/ 05 марта 2010

вы можете просто использовать strlen () .

$mystr="rjm1986 * SinuhePalma * excel2010 * Jimineedles * 209663603 * C6A7XR * Snojog * XmafiaX * Cival2 * HitmanPirrie * MAX * 4163016 * Dredd23 * Daddy420 * mattpauley * Mykillurdeath * 244833585 * KCKnight * Greystoke * Fatbastard * Fucku4 * Davkar * Banchy2 * ET187 * Slayr69 * Nik1236 * SeriousAl * 315791 * 216996334 * K1ra * Koops1 * LastFallout * zmileben * bismark * Krlssi * FuckOff1 * 1owni * Ulme * Rxtvjq * halfdeadman * Jamacola * LBTG1008 * toypark * Magicman6497 * Tyboe187 * Bob187 * Zetrox";
$s = explode(" ",$mystr);
foreach($s as $v){
    $len=strlen($v);
    if($len>=3 && $len<=16){
        echo "found: $v\n";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...