我正在尝试验证职位描述。我通过描述值字段查找任何锚标记。如果它们存在,我会抛出一个错误

get description() {
        return this.form.get('description');
      }



  onSubmit() {
  ,javascript,xpath"/>
	














首页 > 解决方案 > 如何检测字符串中的锚标记。两个都

问题描述

我正在尝试验证职位描述。我通过描述值字段查找任何锚标记。如果它们存在,我会抛出一个错误

get description() {
        return this.form.get('description');
      }



  onSubmit() {
    const desc = this.description.value;
    const div = document.createElement('div');
    div.innerHTML = desc;
    const iterator = document.evaluate('//a', div, null, XPathResult.ANY_TYPE, null);
    const anchors = iterator.iterateNext();
    while (anchors) {
      this.toastr.error("To better improve service, external links are not permitted.");
      return false;
    }
....
}

我的问题是当您复制并粘贴所见即所得中的值时,此代码有效。如果您手动执行此操作。该值如下所示

在此处输入图像描述

我需要使用 xpath 或任何东西来检测<a相似的标签和&nbsp;&lt;a类型模式。这可能吗?

这是我使用 domparser 的修订版。仍然没有运气

      onSubmit() {
        const desc = this.description.value;
        const div = document.createElement('div');
        div.innerHTML = desc;
        const domparser = new DOMParser();
        const parsedDiv = domparser.parseFromString(div.textContent, 'text/html');
        const iterator = document.evaluate('//a', div, null, XPathResult.ANY_TYPE, null);
//Still Returns Null for iterator2
        const iterator2 = document.evaluate('//a', parsedDiv, null, XPathResult.ANY_TYPE, null);
        const anchors = iterator.iterateNext();
        while (anchors) {
          this.toastr.error("To better improve service, external links are not permitted.");
          return false;
        }
    ...
    }

表单提交后 Redux 状态未更新

我在使用 Redux 更新状态时遇到了一些问题。我正在使用 redux-form 提交一些值,并且我的 action/reducer 可以正常工作。但是我的更新操作/减速器在提交表单后没有改变状态,我得到了相同的状态返回。这是我的 ReduxDevTools 的截图: 在此处输入图像描述 所以当提交表单时,我可以看到 addMovementForm 的值部分中更新了新值(movementWeight:'200')。但是当我的 UPDATE_MOVEMENT 动作被调用时,我仍然得到了我的原始值(movementWeight:'100')。我知道我做错了什么,但我不知道是什么。这是我的行动:

export const updateMovement = (id, formValues) => async dispatch => {
    const response = await movements.patch(`/movements/${id}`, formValues);
    const updateId = response.data.id;
    dispatch({ type: constants.UPDATE_MOVEMENT, payload: { data: response.data, id: updateId } });

我的减速机:

const initialState = [];

const movementReducer = (state = initialState, action) => {
    switch (action.type) {
        case CREATE_MOVEMENT: 
            return [
                ...state, action.payload
            ];
        case UPDATE_MOVEMENT:
             return [ ...state.map(item => item.id === action.payload.id ? {...item, ...action.payload.data} : item)]

标签: javascriptxpath

解决方案


也许以下内容会有所帮助,实现我的建议“如果您将 div 的 textContent 提供给另一个 HTML 解析步骤,parseContextualFragment您当然可以在片段上运行 XPath 并检查元素”:RangeparseFromString(div.textContent, 'text/html')DOMParser

    const desc = `<p>This is an element with an escaped link &lt;a href='http://example.com/'&gt;example&lt;a/&gt.<\/p>`;
    const div = document.createElement('div');
    div.innerHTML = desc;
    const outerAElementSelection = document.evaluate('.//a', div, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
    console.log(outerAElementSelection.singleNodeValue != null);
    
    const innerDoc = new DOMParser().parseFromString(div.textContent, 'text/html');
    
    const innerAElementSelection = innerDoc.evaluate('//a', innerDoc, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
    
    console.log(innerAElementSelection.singleNodeValue != null);


推荐阅读