1

Post次の検証ルールを持つモデルがあります。

public $validate = array(
    'title' => array(
        'between' => array(
            'rule' => array('between', 1, 60),
            'message' => 'Between 1 and 60 characters in length'
        ),
        'format' => array(
            'rule' => array('custom', '~[a-zA-Z0-9\s-]~'),
            'message' => 'Alphanumeric characters, spaces and dashes (-) only'
        )
    ),
    'body' => array(
        'between' => array(
            'rule' => array('between', 1, 65535),
            'message' => 'Between 1 and 65535 characters in length'
        )
    ),
    'slug' => array(
        'between' => array(
            'rule' => array('between', 1, 60),
            'message' => 'Between 1 and 60 characters in length'
        ),
        'format' => array(
            'rule' => array('custom', '~[a-zA-Z0-9-]~'),
            'message' => 'Alphanumeric characters and dashes (-) only'
        )
    )
);

次のような新しい投稿を挿入するビューもあります。

<?php $this->Html->script('add-post', array('inline' => false)); ?>

<h1>Add post</h1>

<?php echo $this->Form->create('Post'); ?>
<?php echo $this->Form->input('title'); ?>
<?php echo $this->Form->input('body'); ?>
<?php echo $this->Form->input('slug'); ?>
<?php echo $this->Form->end('Publish'); ?>

さて、タイトルのようなフォームを送信するとblog post title £$&£$^£$、正規表現がそのタイトルの記号と一致しないにもかかわらず、フォームが通過して挿入されます。これは、正規表現を使用して形式をチェックするすべてのフィールドで発生します。

ただし、ルールに合格しない投稿between(60 文字を超えるタイトルなど) を送信しようとすると、検証エラーが発生します。

ここで何がうまくいかないのでしょうか?

4

1 に答える 1

2

正規表現パターンは、これらの文字の少なくとも 1 つが文字列内のどこかにあることを確認するだけです。£$&£$^£$そのため、その文字列のどこにも有効な文字が見つからないため、単独で投稿すると失敗します。ルールを次のように置き換える必要があります。

~^[a-zA-Z0-9\s-]+$~
于 2013-01-05T04:13:23.490 に答える